- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我读到我在ESP8266的Arduino代码中使用need to add the ICACHE_RAM_ATTR macro to interrup service routines (ISRs) and to every function that is called from there来防止随机崩溃。我也找到了an explanation of what the macro ICACHE_RAM_ATTR does,尽管我不确定该解释是否适用于Espressif ESP8266 SDK,也适用于ESP8266上的Arduino。而且我不明白为什么我需要将宏添加到ISR中。
第一个问题:为什么我需要将ICACHE_RAM_ATTR宏添加到ISR和从那里调用的所有函数?
下一个问题是,如果我强制内联从ISR调用的函数会发生什么:
inline void doStuff() __attribute__((__always_inline__)) { // <-- necessary to add ICACHE_RAM_ATTR here?
// no more function calls here
}
void ICACHE_RAM_ATTR handleInterrupt() {
doStuff();
}
最佳答案
ICACHE_RAM_ATTR和ICACHE_FLASH_ATTR是链接器属性。编译草图后,您可以说该功能是否应存储在RAM或FLASH中(通常不设置任何内容:无缓存)。
ESP8266是多任务处理,ESP32具有2个内核。因此,您可以将代码作为多线程执行-因为它使用RTOS。
现在的问题是:整个闪存都用于程序和存储。只能通过1个线程完成对Flash的读写。如果您尝试同时通过2个不同的线程访问闪存,则ESP可能会崩溃。
这是因为您可以将函数放在RAM中而不是闪存中。因此,即使您正在向EEPROM或闪存中写入内容,也可以在不访问闪存的情况下调用此功能。
使用ICACHE_RAM_ATTR
将函数放在RAM上。
使用ICACHE_FLASH_ATTR
,您可以将该函数放在FLASH上(以节省RAM)。
中断功能应使用ICACHE_RAM_ATTR。经常调用的函数不应使用任何缓存属性。
重要提示:切勿在中断内访问您的闪光灯!该中断可能会在访问闪存期间发生,因此,如果您尝试同时访问闪存,则会崩溃(有时会在使用设备后的1-2小时内发生)。
由于只有32kb的IRAM(指令RAM),因此即使可能的话,也应尝试仅将中断功能放入RAM,而不是所有功能。
第二个问题:
不,绝对不!内联是另一个编译器标志,因此编译器将尝试将整个函数放在调用者函数内=>将函数调用转换为main内部的c++代码。这并不意味着编译器会这样做,只需尝试一下即可。如果在编译草图后该功能不再存在,则不能要求将该功能放入RAM中。
关于arduino - ESP8266/Arduino : Why is it necessary to add the ICACHE_RAM_ATTR macro to ISRs and functions called from there?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58113937/
是 reducer 之类的Redux用 ReactJS 开发时真的很有必要? 这只是设计更简洁代码的一种方式吗? 如果有,什么时候? 最佳答案 不,reducers 或 Redux 不是必需的。 Va
查看以下code : 'use strict'; const {Builder, By, Key, until} = require('..'); const {Options} = require(
我正在尝试将一组不相交的 Maven 项目链接到一个标准的多模块项目中。 有趣的是,模块目前没有按自然层次结构排列。如果我与父 pom 链接在一起,那么在我添加 relativePaths 之前 re
我有一个四核处理器,我真的很想在运行快速模拟时利用所有这些内核。问题是我只熟悉实验室中的小型 Linux 集群,而我在家里使用的是 Vista。 对于使用 C 或 Java 进行多核编程,我想研究哪些
假设我有一个 TADOQuery 对象,我在程序中将其重复用于不同目的。完成后是否需要显式清理参数?或者当我清除 SQL 时会自动发生这种情况吗? 例如 adoGenericQuery.SQL.T
我最近在几个不同的地方看到了类似这样的评论:“我在学校学到了递归,但从那以后从未使用过它或感觉需要它。” (递归似乎是某些程序员群体中“书本学习”的流行示例。) 确实,在 Java 和 Ruby[1]
我目前正在试验 tensorflow 分布,我想知道是否有必要包含参数服务器。 我使用的方法是 tf.estimator.train_and_evaluate。我的设置是在三台服务器上运行一台主服务器
http://play.golang.org/p/Xn3Qw7xAi3 很难理解 channel 。 我有 func main() { in := make(chan int) out :=
通读React - Basic Theoretical Concepts以及即将推出的React Fiber Architecture ,记忆化似乎在 React 数据处理逻辑以及不可变数据存储中发挥
我正在使用koa-routers来处理向第三方api发送电子邮件请求的路由。我是否正确处理错误?我需要退货吗?我应该返回ctx.response吗?我看到一些以func next()结尾的示例。但是,
我正在使用 rails 3 下的 devise 身份验证插件。目前,我已禁用电子邮件确认,因此注册非常简单快捷。 我想知道是否需要某种验证码来保护网站免受机器人攻击。我想避免让我的数据库充满虚假用户,
我正在探索 JavaScript 中的继承概念,但我认为我遗漏了一些东西。 我的目标:我想创建一个继承自另一个对象的对象。JavaScript,我认为我遗漏了一些东西。 例如,我创建了一个继承自对象“
Java 使用 Cipher类作为特定密码实现的抽象。在我的项目中,我主要使用对称 block 密码(AES、Twofish、3DES 等),我正在寻找一种方法来动态创建/初始化任何可能的对称 blo
我目前必须学习Java JDBC。 今天我了解了如何从 JDBC 中调用存储过程。 当我有一个像这样的存储过程时,我没有得到... CREATE PROCEDURE demo.get_count_fo
我目前正在优化我的应用程序。我的表结构简化如下: 主类别 姓名 位置 有子类别 子类别 姓名 位置 属于MainCategory 现在,如果用户在第一个 View Controller 中选择一个主要
我正在阅读教程以了解多线程,并且到处都看到人们重写 run 方法。我不清楚from the doc This class represents an activity that is run in a
在this文档的一部分,提到 nlp.pipe() 并行工作,并给出了以下示例: for doc in nlp.pipe(texts, batch_size=10000, n_threads=3):
只是非常肤浅地检查了 Android 开发,似乎大多数人都在使用 Java。然而 Android includes a set of C/C++ libraries used by various c
好的,所以我有这个标准查询来为用户获取消息 $s=$this->select()->where("to=?",$user->id)->orWhere("from=?",$user->id); 它在 t
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
我是一名优秀的程序员,十分优秀!