发现一个bug不知道是单片机还是Keil的问题 | 是细节问题,大家必须看下,原子操作
发现一个bug,不知道是单片机的问题还是Keil的问题,程序中只有1个定时器中断程序bkeuqoaq 发表于 2024-11-20 13:11
void main(void)
{
P_SW2 |= 0x80;
我虽然没点开楼主的程序,但是结合他的截图,和你的修改,我就知道问题出在哪里了
{:5_278:}
51单片机是8位机,
因此对16位和32位C语言变量的读写并不是原子操作,需要逐个字节提取。
如果在16位数据的读取过程(包含若干条指令),进了中断导致数据变化,
那么将会错误地读到来自不同时刻的高低字节。
比如举个例子,当变量值为511时
高字节为1,低字节为255
此时main函数打算调取这个数据
先调取了低字节 255
突然进了中断,中断对这个变量进行了自增,变为512,也就是
高字节为2,低字节为0
回到main函数
main函数继续调取高字节,读到2
main函数中拼凑得到的高低字节分别为2和255,拼凑也就是767。
已经既不等于511,也不等于512!!!
大相径庭。所以进行16位,32位的volatile变量访问时,一定要关闭中断!确保访问操作的原子性
{:5_361:}
单片机用的是STC8H4K64TL,STC8H1K28我也试了,也是这种情况 Keil版本我也试了,9.60,9.06, 9.53这些版本也是同样的问题 硬件仿真和直接烧录程序,结果都是一样的,直接烧录程序,是通过P3.4的波形看的 这是项目文件,官方可以测试一下
STC8H8K64U也是同样的问题 编译器问题
不要声明时就赋值
初始化时赋值 CyberHamster 发表于 2024-11-20 11:54
编译器问题
不要声明时就赋值
初始化时赋值
多谢指点,我试一下看看 CyberHamster 发表于 2024-11-20 11:54
编译器问题
不要声明时就赋值
初始化时赋值
keil还有这种问题啊。声明时不能赋值! 变量定义时不赋初值,在主程序中赋值,结果就正常了,再请问一下,局部变量也是这样吗?