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

发布于 2020-12-27 12:43:21 字数 967 浏览 1215 评论 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程序时尤其有用。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

JSmiles

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

0 文章
0 评论
84961 人气
更多

推荐作者

已经忘了多久

文章 0 评论 0

15867725375

文章 0 评论 0

LonelySnow

文章 0 评论 0

走过海棠暮

文章 0 评论 0

轻许诺言

文章 0 评论 0

信馬由缰

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文