前言:
新工程,修改TAB选项,warning选项,c编译选项优化等级,添加文件,路径,编译宏等,且不能加入.i文件,会认为是镜像文件导致不能编译
小技巧:批量导出工程路径,命令ok,工程测试有点错误,工程目录级别要找对
git命令:find ./ -type d |sed ’s///\/g’
🉑keil中C99不支持函数隐式声明,所以消警告⚠的好习惯由此体现
正文问题解决:
keil工具编译器升级后,报错:
1、不支持non-ASM in naked function
2、must be in IT block
V5版本和V6版本的区别,V6手册中搜索支持naked,但实际之前针对gcc编译器的错误中断函数的写法不再适用,所以需要改写汇编指令
方案1:C与汇编混合编程
网上很多教程,不再赘述
方案2:查看指导手册Help>uVision Help
按照手册方式修改即可完美解决。
报错行汇编含义:先获取mcu使用的是MSP还是PSP?然后获取值。
报错:
更改后:
遗留问题:
非裸函数时有压栈操作,从堆栈提取数据时需改偏移x
_frame[x]
方法:
用跑飞的示例跑到此位置,调试观察mem堆栈里的值和SP寄存器,看看SP指针的地址往后偏移多少与跑飞的地址能对应上,反推出偏移。
另重点:linker>scf文件
后续:v6编译器支持裸函数,写法正确,报不支持non-ASM in naked function,是因为裸函数中带有C语言形式不支持,所以可以改写C语言部分为汇编语言即可,如果觉得麻烦,也可以把C语言部分的代码整体作为一个函数,用汇报语言的跳转指令BL function函数即可,改写后需验证是否可以正常执行到异常中断处理函数的while(1)!