今天研究了一下avr的汇编指令,发现第一条指令必须要是rjmp或其他跳转(跳转到主程序),否则程序就跑飞了。把主程序放到falsh的$0000000位置也不行。
cpu不是从flash的0位置顺序读取指令执行吗? 为什么第一条必须是跳转才行?
正确代码:
.org 000000
rjmp start
nop
start:
ldi r16,0xFF
out DDRB,r16
sbi PORTB,PB0
Loop:
rjmp loop错误:
start:
ldi r16,0xFF
out DDRB,r16
sbi PORTB,PB0
Loop:
rjmp loop离线
看来楼主不是学电子的出身,学过51的,应该都知道,前面几个地址被中断占了。
最近编辑记录 abigpad (2021-06-04 21:01:31)
离线
看来楼主不是学电子的出身,学过51的,应该都知道,前面几个地址被中断占了。
发帖前确实忘了中断了,但是看到文档,试验了一下在0地址把中断关掉,还是跑飞
离线
算了,还是正常的跳过中断吧:
.cseg
.org $0
rjmp start
.org $000A
start:
sbi DDRB,DDB0
sbi PORTB,PB0
Loop:
rjmp loop离线
有些跳转是为了让CPU刷新内部指令队列,跳一下它就会重新译码指令了。
离线
这是 cpu 设计的时候就指定了的,程序空间的前面一段保存 中断向量表。即使关闭中断,这些中断对应的中断向量位置也要保留。 程序空间的起始,是 reset 这个“中断” 的中断向量的位置。
离线
你可以看 ARM M3的 Core设计,
M3 内核设计上: Addr:0x00 ~ 0x03 地址放 SP指针,Addr: 0x04 ~ 0x07 放 第一个 JMP 位置;
离线
嘛。STM32 网上有 很多Boot + App参考设计, boot 跳转 APP的时候 会做两个事情 一个 copy SP指针, 另一个 加载 PC指针到 APP真实的第一条指令位置;(还有就是修改中断向量表 指向基地址);
AVR的话,你得看 AVR的 CPU 启动相关文件了;大差不差;
当年在赛元51 MCU上手搓过 中断向量表 支持 boot+app跳转;
离线