处理器字长?8位处理器=8位字长吗?

4

我原以为如果我有一个AVR 8位微控制器,那么字长就是8位/1字节?但在数据手册中,它说明大多数AVR处理器具有16位字长。但它并没有说这个特定的处理器是否有这个特性。在具体的数据手册中通常不会这样陈述,有些奇怪。

那么,如果这不是字长,8位和32位MCU是什么意思呢?

如果字长=2字节,则以下代码在C中是原子的:

U16 Position;

Position = 1000;

但如果字长为1字节,我应该在写入此变量时禁用中断(中断使用此变量)吗?禁用中断会有多慢?


1
现代64位CPU具有256位宽字的寄存器(AVX寄存器),而旧的32位CPU具有128位宽的寄存器(MMX,今天仍在使用)。您的CPU的位数与引用字的宽度几乎没有关联,甚至更重要的是,当针对不同的寄存器时,您可以拥有不同的最佳大小。MMX与AVX是这个简单例子,在现代CPU中,您可以同时获得两者,并且它们具有不同的字长。您应该阅读制造商文档,这是唯一可以告诉您所需信息的东西。 - user2485710
你应该阅读生成的代码来弄清楚这一点,或者(更好的方法)搜索关于原子指令的特定于平台的信息。不能安全地假设例如单个移动到RAM是原子性的。 - unwind
你应该为你的微控制器准备一个特定的stdint.h文件,以typedef数据类型,这样更容易知道它们的位宽。 - Fiddling Bits
1个回答

6
传统的AVR系列(即ATtiny、ATmega、ATxmega,不是AVR32)是8位MCU,使用8位寄存器/累加器工作,尽管在处理地址对指针时有一些16位指令。
不幸的是,“字”没有普遍接受的定义。在这种情况下,我怀疑作者只是将16位值称为“字”,而不是8位字节或32位双字。
因此,不能保证16位变量被原子地访问。幸运的是,一些最重要的I/O寄存器(如定时器)具有内部锁存器来隐藏这个事实,但是需要小心共享中断的RAM变量。
暂时禁用中断非常快,每个CLI/SEI指令需要一个周期。某些编译器(例如ImageCraft)的一个陷阱是,在函数中使用内联汇编可能会禁用优化,因此实际成本可能会稍高。考虑只禁用相关的中断以避免这个问题并减少延迟。
请注意,与其他一些MCU不同,原子位访问通常仅限于最低的I/O端口范围内的一小部分寄存器,通常是几个PORT和通用寄存器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接