我原以为如果我有一个AVR 8位微控制器,那么字长就是8位/1字节?但在数据手册中,它说明大多数AVR处理器具有16位字长。但它并没有说这个特定的处理器是否有这个特性。在具体的数据手册中通常不会这样陈述,有些奇怪。 那么,如果这不是字长,8位和32位MCU是什么意思呢? 如果字长=2字节,则以下代码在C中是原子的: U16 Position; Position = 1000; 但如果字长为1字节,我应该在写入此变量时禁用中断(中断使用此变量)吗?禁用中断会有多慢?
传统的AVR系列(即ATtiny、ATmega、ATxmega,不是AVR32)是8位MCU,使用8位寄存器/累加器工作,尽管在处理地址对指针时有一些16位指令。不幸的是,“字”没有普遍接受的定义。在这种情况下,我怀疑作者只是将16位值称为“字”,而不是8位字节或32位双字。因此,不能保证16位变量被原子地访问。幸运的是,一些最重要的I/O寄存器(如定时器)具有内部锁存器来隐藏这个事实,但是需要小心共享中断的RAM变量。暂时禁用中断非常快,每个CLI/SEI指令需要一个周期。某些编译器(例如ImageCraft)的一个陷阱是,在函数中使用内联汇编可能会禁用优化,因此实际成本可能会稍高。考虑只禁用相关的中断以避免这个问题并减少延迟。请注意,与其他一些MCU不同,原子位访问通常仅限于最低的I/O端口范围内的一小部分寄存器,通常是几个PORT和通用寄存器。
stdint.h
文件,以typedef
数据类型,这样更容易知道它们的位宽。 - Fiddling Bits