关于 keil 和 C 的那些杂乱知识点 - 未分类

关于 keil 和 C 的那些杂乱知识点

发布于 2020-12-27 字数 1550 浏览 1069 评论 0

最近在做 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程序时尤其有用。

如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

扫码加入群聊

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

目前还没有任何评论,快来抢沙发吧!

关于作者

JSmiles

生命进入颠沛而奔忙的本质状态,并将以不断告别和相遇的陈旧方式继续下去。

2891 文章
评论
84935 人气
更多

推荐作者

勿忘心安

文章 0 评论

ekko

文章 0 评论

江挽川

文章 0 评论

献世佛

文章 0 评论

Meets

文章 0 评论