一、keil调试
1、keil快捷键
先f7编译后f8下载,不得不就要ctr+f5进入调试状态,调试状态下再ctr+f5就退出调试
调试若直接一直run就f5,遇到断点则停止
调试若一句一句语句的过就f11即一步一步
调试若一下执行过此函数或者单个语句就f10即从1到0执行完
调试想加断点就f9,就把断点加上;ctr+f9就把断点取消了
蓝色箭头是临时断点,放到想执行到行,然后ctr+f10表示从1到0执行到想要的位置即run to cursor
一步一步在函数里执行,想一下将剩余的执行完然后从此函数里出来,那么就ctr+f11表示执行完此函数的剩余部分然后从此函数中退出,即退出单步执行
跳转到函数定义处就f12
ctrl+b进入断点高级设置,可以设置断点停止条件:检测某个变量等于、大于、小于某个值时此断点才起作用;检测到某个变量或地址存的数据被写入或者被读取时此断点才起作用;经过此断点时不停止运行程序而是做一些其他操作,比如打印一些字符信息等
2、16个通用寄存器
r0 - r3这4个用于函数传参,如果参数超过4个,多的参数则会入栈
pc是程序指针寄存器,存放当前要执行的code的地址
sp是栈顶指针寄存器,存放的是当前栈顶的地址
lr是link register即函数跳转前保存现场存放的地址,当函数执行完毕后,会取出lr的值并赋值给pc,所以说,lr存放的是当前函数执行结束后将要执行的下一条code的地址
MSP为当前程序系统主栈,PSP则为操作系统的任务栈,这两者的区别是,如果使用了操作系统,则当前任务中的所有调度关系使用的是任务栈,而类似中断这种内核的操作使用的是主栈;如果未使用操作系统,则只会使用主栈,不会使用任务栈。
通过"Internal"可以查看当前是处在中断还是任务中,Mode为"Thread"表示是在线程/任务中,或者是函数中(非中断),为"Handle"表示是在中断中;Privilege为"Privelege"表示当前处于特权模式。Stack为"PSP"表示当前使用的是任务栈,为"MSP"则表示使用的是主栈。
闪灯程序并且没有操作系统,因此stack只是用msp(主栈)而不是用psp(线程任务栈),如果有系统,则中断里用主栈,任务里用任务栈。没有系统的话就中断和while里全都用主栈。
sp为0x20000488,表示当前栈区的栈顶的地址
lr为0x080002ed,表示的则是在执行USART_Init()函数后返回的地址,即USART_Init()函数执行结束后返回将要执行的紧接着的下一条语句的地址
pc为0x08000b96
右边汇编就是停留在0x08000b96
0x08000b96是函数USART_Init()的存放的地址即此函数的第一条语句存放的是地址,打了断点,因此0x08000b96对应的这个语句还没有执行
stack为msp
mode为handle,因为临时断点打在了中断回调函数里,当前停留在中断里,则mode会变成handle。如果停留在非中断即外部while里,则mode会为thread。