我正在阅读http://embeddedgurus.com/embedded-bridge/2010/03/different-bit-types-in-different-registers/,其中说:
通过读/写位,固件可在需要时设置和清除位.它通常首先读取寄存器,修改所需的位,然后将修改后的值写回
我已经遇到了这个问题,同时保留了一些由老盐嵌入式人员编写的生产代码.我不明白为什么这是必要的.
当我想设置/清除一点时,我总是只是或者使用位掩码.在我看来,这解决了任何线程安全问题,因为我假设设置(通过赋值或使用掩码进行设置)寄存器只需要一个周期.另一方面,如果您首先读取寄存器,然后修改,然后写入,读取和写入之间发生的中断可能导致向寄存器写入旧值.
那么为什么读 - 修改 - 写?还有必要吗?
我正在开发一个嵌入式项目(PowerPC目标,Freescale Metrowerks Codewarrior编译器),其中寄存器是内存映射的,并在很好的位域中定义,以便轻松地对各个位标志进行调整.
目前,我们正在使用此功能来清除中断标志并控制数据传输.虽然我还没有注意到任何错误,但我很好奇这是否安全.有没有办法安全地使用位字段,或者我需要将每个包装在DISABLE_INTERRUPTS ... ENABLE_INTERRUPTS?
澄清一下:micro提供的头文件有
union {
vuint16_t R;
struct {
vuint16_t MTM:1; /* message buffer transmission mode */
vuint16_t CHNLA:1; /* channel assignement */
vuint16_t CHNLB:1; /* channel assignement */
vuint16_t CCFE:1; /* cycle counter filter enable */
vuint16_t CCFMSK:6; /* cycle counter filter mask */
vuint16_t CCFVAL:6; /* cycle counter filter value */
} B;
} MBCCFR;
Run Code Online (Sandbox Code Playgroud)
我假设在位域中设置一点不是原子的.这是正确的假设吗?编译器实际为比特域生成了什么样的代码?使用R(原始)字段自己执行掩码可能会更容易记住操作不是原子操作(很容易忘记类似的赋值CAN_A.IMASK1.B.BUF00M = 1
不是原子的).
您的建议表示赞赏.
我们正在飞思卡尔PPC微处理器上开发一些代码(目前是5517和5668),我想知道是否可以将Lua放在它们上面.
这些设备需要在现场轻松编程/重新配置,当前产品使用可加载的专有解释逻辑语言,我们的软件(用C语言编写)运行解释器.我想转向一种更好的语言(实现有点错误和缓慢),所以我在考虑Lua,但内存占用率必须非常低.对于5517(我们可能不使用),最大RAM为80K.在5668上有更好的东西,有592K的RAM.
那么有人知道我是否可以将Lua放在裸机上?我们实际上没有运行操作系统.如果是这样,有没有估计我们可能会看到什么样的内存占用?需要多少努力?
如果做不到这一点,是否有人知道在没有操作系统的内存受限环境中可能更好的任何类型的解释器?或者我们更好地滚动自己的?
我想要一种简单的方法来在一个方法的开头删除代码,该方法将强制该方法仅在主线程上运行(因为该方法更新了UI元素).
目前,我有类似的东西:
if (![NSThread isMainThread]){
[self performSelectorOnMainThread:_cmd withObject:_results waitUntilDone:NO];
return;
}
Run Code Online (Sandbox Code Playgroud)
但是我想要一种方法将它包含在一个宏中而不必输入方法的参数.看起来应该有一些方法来迭代传递给当前方法的参数列表并创建一个NSInvocation或类似的.有什么想法吗?