完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我是 ESP-IDF 编程的新手。一直在阅读文档,我有一些问题。请注意,我不关心停止中断的高级同步,而是我感兴趣的是框架如何使用 XTensa 本机指令来支持同步。
ESP32S3 API 指南如下: ESP 目标上的 SMP 两个相同的内核称为 CPU0(即协议 CPU 或 PRO_CPU)和 CPU1(即应用程序 CPU 或 APP_CPU)。这意味着一段代码的执行是相同的,无论它运行在哪个内核上。 对称内存(有一些小的例外)。 (a) 如果多个内核访问同一个内存地址,它们的访问将在内存总线级别串行化。 (b) 对同一内存地址的真正原子访问是通过 ISA 提供的原子比较和交换指令实现的。 允许一个 CPU 在另一个 CPU 上触发和中断的跨核中断。这允许内核相互发送信号。我的问题是 上面的 (a) 和 (b) 是在框架级别自动实现的,还是作为程序员我需要处理的? 对于不同 CPU 中的 2 个进程或同一 CPU 中的 2 个事件,上述答案是否相同? 我可以看到 API 通过 esp_cpu_compare_and_set() 提供对 S32C1I/SCOMPARE1 的访问。有什么类似于 L32AI/S32RI 的吗? |
|
相关推荐
3个回答
|
|
A是在硬件层面上实现的,软件或框架不需要做任何事情。B 在框架中支持它(例如通过您提到的 esp_cpu_compare_and_set 函数)但由于框架无法推断比较/交换需要是原子的,您需要调用该函数(或更好:C 语言等价物,见下文) 如果你需要一个原子比较/交换。
将 A 和 B 考虑在内的代码既适用于不同内核上的任务,也适用于运行在同一内核上的任务。 我不确定我们有 L32AI 和朋友的函数,但总的来说:如果你想像这样使用原子,我们支持 C 编译器的原子概念。 |
|
|
|
变量“y”是否会收到一个扰乱的值,或者 32 位读写总是原子的?
- 假设 process1 和 process2 在不同的内核上运行 - 假设 process1 和 process2 在同一个内核上运行,process2 具有更高的优先级。 代码: uint32_t x = 0; uint32_t y; void process1() { while(true) x++; } void process2() { while(true) y = x; } |
|
|
|
多核 CPU 上的 Std::atomic 确实是使用指定的原子指令(如比较和交换)实现的。
您的示例实际上不起作用,但不是由于所描述的原因:由于 process2 的 while() 循环中没有函数调用,编译器将假定 x 永远不会更改,并且可能会将其优化为 'y=x ; 尽管() ;'。(抱歉,我忘记了这种行为的确切术语。)但是额外假设你会在 while 循环中放置一个函数调用或其他东西来打破编译器的假设,你的代码会做你期望的。请注意,如果您要将 x 更改为 uint64_t,或在 process2(或 process1 以外的任何其他进程)中写回 x,您的代码会巧妙地中断。所有这些都适用于同一 CPU 和不同 CPU 上的两个任务。 正如我之前提到的:除非你有充分的理由不这样做,否则我强烈建议不要让任何试图维护代码并简单地使变量成为原子变量(或在变量周围放置一个自旋锁,如果适用)的人感到惊讶。如果没有,至少留下很多关于您所做的评论以及它很脆弱的事实。 |
|
|
|
只有小组成员才能发言,加入小组>>
179个成员聚集在这个小组
加入小组439 浏览 1 评论
1384 浏览 1 评论
608浏览 6评论
505浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
487浏览 5评论
489浏览 4评论
472浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-22 19:52 , Processed in 0.867115 second(s), Total 79, Slave 63 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号