我很确定还有另外一个代码除叻你在这里发布的代码...... 无论如何,我建议你在test == 0时放一个数据断点当断点触发时,您将能够看到哪个代码重置此变量 |
编译器输出的代码包含问题的答案。 您的代码包含ISR和主代码之间的访问冲突 当您指定测试是易失性时,编译器假定其值可能在两次连续读取之间发生变化但它不会使分配成为原子,即ISR可能会中断它 只有汇编指令是原子的(有一些例外,例如DIVW指令可能被中断但它们只影响核心寄存器),而赋值通常包含两个汇编指令:一个读取指令(例如LD Atest)和写一个(例如LD测试,A) 编译器有时输出MOV测试,测试是原子指令 这意味着您应该注意汇编代码以了解发生的情况并对代码进行正确的更正。 如果在分配之前禁用中断并在之后启用它们则访问冲突将消失,但此修复程序会将两个字节添加到可执行文件大小 |
当变量设置为0时(我永远不会发生),我试图设置一个数据中断并在装配线处断开: |
当初始化所有全局变量(即设置为零)时,断点在初始化阶段停止了代码 这意味着你的main()仍然会被执行,所以这个汇编程序转储是没用嘚...... |
main.c在主模块之前声明变量 |
只有小组成员才能发言,