pragma data_alignment_restore user data_realignment

电脑杂谈  发布时间:2017-05-20 04:00:47  来源:网络整理

您需要 登录 才可以下载或查看,没有帐号?

x

最近使用STM32开发一个带触摸屏(480*640)的控制器,使用uCOS-III 3.04 和 emWin 5.26,一开始使用的是MDK平台开发的, MDK 版本是 5.14,使用的STM32F103ZG,库版本是 3.5。

但是更换为IAR平台后,也遇到了一些问题,下面我列举出来,供大家参考,免得跟我一样走了很多弯路:

1、编译通不过,有错误。由于平台不同, 针对 CPU进行优化的那些汇编代码,比如ucosIII的汇编代码,启动文件,我都更换过了, 怎么还有错误呢? 后来发现是由于新版IAR的原因,跟 ST 的库 3.5 版本 的 CMSIS 文件存在不兼容,因为把以前库里面的 CMSIS 2个文件(C和h文件)删除, 在IAR的工程右键菜单 Option->General Options->Library Configuration,里面勾选上“Use CMSIS”,这样就可以了。

pragma data_alignment_restore user data_realignment

2、编译通过,大量警告。经过查看警告,发现基本上是2种,一种是 浮点数 隐性 转换 为整数,另外一种是 volatile 修饰的全局变量 直接参与了计算。 这个2个问题,确实是我写代码没有注意到的问题, 但是MDK 却没给出任何警告, IAR 还是尽职一些。修改之后,编译0警告,0错误。pragma data_alignment

3、uCOS-III 不能启动,执行 OSStart(&err); 后却没有进入第一个任务。 这个确实花了我大量时间,最后又跟 uCOS 官方的代码进行比较后,发现我在启动OS之前 没有禁用 中断。果然 加上禁用中断的代码,可以启动了。 奇怪的是,以前在MDK平台下,没加这个代码也是没有问题的,IAR却不行了。 估计是MDK编译的代码里面针对CPU已经做了一些初始化工作,而IAR 却没有, 而需要我们自己去处理。pragma data_alignment

4、使用 sprintf 转换 浮点数 出现问题。这个问题,我开始以为好解决,因为IAR里面有设置(在IAR的工程右键菜单 Option->General Options->Library Options里面),把printf 使用的库,选择 Full, 结果一测试,还是不行。 后来经过大概半天时间的查找(期间一度认为IAR有BUG),后来发现 是我的 uCOS-III的任务堆栈没有 8字节对齐, 因为之前在 MDK里面使用了关键字 __align(8) 对齐, 到了IAR 平台下,由于不认这个关键字,就给删了。 当时看任务能够运行,还以为不对齐也没问题,看来我又想错了。 后来在IAR下加了 对齐的修饰, 浮点数的打印也好了,IAR下使用的方法为:#pragma data_alignment=8。

至此,经过2天的调试,又发现了IAR的一些优点,比如:

1、编译速度比MDK快, 这个就不多说了, 用过人都有感觉。

realignment_restore user data_pragma data_alignment

2、代码优化的比MDK好,比如我用的 emWIN系统,用MDK编译出来的程序,运行中切换界面,个别地方总会卡一下,当时试了多种不同的写法,都不能解决,还以为emWIN存在BUG, 用了 IAR 才发现, 原来没这个问题,是编译器的问题。

3、代码存在的不规范的地方,IAR 能发现并警告,而MDK却不能,上面我提到了, 对于提高代码质量而言,我觉得IAR 做的比 MDK好。

4、错误的代码,IAR运行必定会出错,而MDK不一定(当然我这个说法也不是绝对的)。比如我程序里面有一个函数中有个变量,应该用 static 修饰的,却忘了加 static ,结果用MDK编译运行 没发现问题(也可能是暂时没发现问题),而用IAR 编译运行后,到这个地方必定出问题, 这我才发现了这处错误。

5、由于使用 uCOS-III, 为了保证每个任务分配的堆栈够用而且不浪费,我在程序里面 做了个 信息打印输出, 每1秒输出1次,以此来观察每个任务 的CPU占用率,堆栈占用率等信息。 而使用了IAR 之后发现,IAR的调试 可以勾选 uCOS-III 插件, 仿真过程中可以,看到每个任务的运行状态,比我打印的那些信息多得多。 看来IAR 又为我节省了CPU资源的开销了。

以上这些是我这3天以来的调试经历,写出来给大家参考下,尤其是新手, 免得跟我一样,本来半天可以搞定的事情,弄了3,4天。同时也给自己建个备忘录吧。

最后,还有一个问题没有解决,就是IAR 左侧的工程列表,里面的文件夹和文件,如何排序,MDK是可以排序的, 而IAR 默认是按照文件名自动排的,也没找到在哪里设置。用鼠标脱的话,只能是把一个文件 放到另外的文件夹里面,顺序改不了。


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-48117-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      • 睿帝杨溥
        睿帝杨溥

        来战

      • 晋康帝司马岳
        晋康帝司马岳

        南海那边的情况不像某些媒体或人物讲述的那么简单

      • 方圆
        方圆

        暢暢等你周五的节目

      热点图片
      拼命载入中...