AVR汇编修改table数码管段码顺序后出现Invalid Opcode错误如何解决
问题成因与修复方案
错误成因
该错误和存储区域空间不足没有关系,核心问题是你把段码表table放在了程序执行流的路径上:
AVR架构下CPU会按地址顺序执行程序存储器中的内容,你在初始化端口的两条指令LDI R17, 0xFF、OUT DDRD, R17执行完成后,没有添加跳转指令,CPU会直接将后续table段存储的数码管段码当做机器指令解析执行。
- 原始0~9顺序的段码前两个字节拼接后恰好是合法的AVR操作码,执行过程中碰巧没有触发异常,流程能正常走到
main逻辑 - 修改为9~0顺序的段码后,前两个字节拼接得到
0xF998,属于非法操作码,因此直接触发报错,报错的PC地址0x0006恰好对应table段的起始位置
修复方法
只需要在端口初始化代码结束后,添加一条跳转指令,引导CPU直接跳转到main标签执行,避开table段的段码数据即可,修改后的代码头部如下:
.org 0x00 LDI R17, 0xFF OUT DDRD, R17 //Define PORT D output RJMP main // 新增跳转指令,跳过table段直接进入主逻辑 table: //save in memory .DB 0b10011000, 0b10000000, 0b11111000, 0b10000010, 0b10010010, 0b10011001, 0b10110000, 0b10100100, 0b11111001, 0b11000000, 0 main: CALL loadFromMemory RJMP main
其余部分不需要做任何修改,即可正常实现倒计数功能。
内容的提问来源于stack exchange,提问作者Hadi Hoteit
相关产品推荐
相关产品推荐

