关于 keil 和 C 的那些杂乱知识点
最近在做 bootloader 的时候,对 51 的存储及架构和 keil 的使用有了更深入的了解,由于知识点比较杂乱,先记录下来,后期再整理。
在 bootloader 程序与用户程序之间跳转的时候使用 LJMP
长跳转指令而不是 LCALL
长调用指令。原因在于,如果使用长调用,会导致函数的嵌套甚至是递归,这显然不符合正常处理逻辑。
成为一个合格的嵌入式软件开发者掌握C的使用基本上就可以了,但是想要更深入点,去对处理器有个更深入的了解和认识,不会汇编语言是一件很痛苦的事情。
startup.A51 可以在用户代码运行之前完成数据空间、栈空间的初始化。合理使用并根据实际项目需求区修改,可以实现些期望在用户代码执行之前完成的操作,比如作为全局变量的数据的初始化。
typedef void (code*USERAPP)(void);
定义一个函数返回值和形参都是void的函数指针,使用效果同 LCALL #funAddr
。
因为IAP的操作必须响应相应中断,否则会导致MCU无限挂起,因此需要将所有的中断都进行绝对定位,并且中断向量所在的第一页不能擦除(如果擦除会导致如果升级失败会导致无法再次进入bootloader)。
我现在使用的V9821存在十几个中断向量,如果一个个在keil的 BL51 Locate
增加绝对地址的链接,会很麻烦也会容易出错,这点需要寻求其他更方便的解决方法,比如增加一个专门用于绝对定位的A51文件。
对于多个函数的绝对地址链接在keil中实现起来比较麻烦,在仔细研究过keil工程后发现,keil的后缀为 .uvproj
的工程文件实际上是一个xml
文件,里面 <CodeSegmentName>
标签所保存的就是 BL51 Locate
选项卡中添加的绝对定位信息,修改这个标签的内容同样可以达到同样的目的。
M51 文件是keil生成的内存布局文件,在设计bootloader程序时尤其有用。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
上一篇: encode / decode 编解码
下一篇: JavaScript 集合的方法
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论