本帖最后由 makesoft 于 2019-12-1 20:58 编辑
没想到51的小程序调试起来这么麻烦,花了整整两天时间,让俺这老江湖汗颜。
其实就是偷懒造成的,一个函数在程序初始化时使用,这个时候系统任何中断并没有打开,另外这个函数在定时中断中也有使用,天真的认为不存在同时调用的可能,所以不可能存在再入的问题,就是没理会重复调用的告警信息。
后来程序不定时的出现问题,因为开始已经有了不可能同时调用再入这个函数的场合,所以就没有检查这个问题。
实在没有办法,刚才检查MAP信息,TNND才发现,其实不仅仅有再入的问题,这个函数使用的局域变量占用的地址,有一个是和其他函数是重复覆盖使用的,真相大白了,两天时间就是不想写一个reentrant,因为会增加一点点代码。
你错了,pic的c编译器你去试试。
而且,51的c编译器也有这种模式
我用过pic,51的c编译器,这两个编译器都有一种没有栈的编译模式,函数的局部变量其实都是全局变量复用。
特别是pic8,根本没有别的选择!51还有得选,pic8在硬件上就没有栈。
所以用了arm之后,再也不想用pic和51了,这些芯片是半残废。
就是最简陋的cortex-m0,也是完整的c语言支持,完整的32为平面寻址。
首先要在Device选项卡中设置使用LX51代替BL51,此时C51选项卡才会出现优化等级10和11,并且尽量使用AJMP/ACALL而不是LJMP/LCALL。
2.png (20.26 KB, 下载次数: 0)
下载附件
2
2019-12-2 10:27 上传
一周热门 更多>