已经解决了。mdk5.15,升级最新pack就可以生成ucosIII的空工程,注意把pandsv和systick两个向量改了就ok了。中断机制和2013年的ucosIII官方文件有不同。之前的移植版本是所有中断向量都指向ucos的系统服务函数,ISR把自己注册到ucos的向量表中,本质上就是所有物理向量映射到ucos,然后由ucos的向量管理机制来处理。好处是所有中断都是由操作系统接管,健壮性较好,但是中断延时较长--延迟时间的确定性由系统调度机制来保证,但是精确性估计不大。mdk生成的ucos工程中,这部分代码由用户自己完成,不再由操作系统接管。同样的,好处是中断响应时间可以精确(系统调度的systick优先级高于自然向量,但是**中好像可以调整把?有需要的自己查手册把。),不好的地方。。。也没啥不好的把。。。
不过两种思路有一个显著区别,还是中断系统的区别。原先老的方式需要修改startup.s,把向量表替换成ucos定义的。这导致startup.s文件不通用。
另一个区别就是mdk4和mdk5的架构变动。mdk4对comsis的支持是通过将文件副本复制到工程文件夹下来实现的。好处是,你不用太担心comsis版本更换的问题,基本上所有的header都在本地,随便改,随便用。我就是在dma.c中添加了一个set_mem_addr函数,导致这个文件不通用,每次新建工程都要主意这个问题。
mdk5采用const引用,这样工程本地就不存在副本,文件小很多,版本管理也更高效。但是就没办法对工程内引用的comsis库进行任何更改了。这样做也确实更严谨。仔细观察引用库的图标,有些文件上带个小钥匙,这些就是锁定的引用。可以用,但是不可以更改。
这次导致我原先mdk4下的程序在mdk5下不能使用的原因就是这个。由于最近事多,即使知道原因,也没心情去细致追究这个细节,所以打算和网友们互通一下,付出点代价,得到点便利。但是好像很多人比较反感?后来在网上搜到一个论坛中提到MKD5中的rots,仔细查看发现已经内部集成了。然后简单测试一下,果然好用就结贴了。
而且集成的完全是按照mdk的架构做好调整的,用起来相当方便。不得不说,mdk5和mdk4的方便性差别实在很大。推荐大家都装一个mdk5看看。减少重复劳动,把精力用在更重要的地方,这才是工具的意义。
另外,mdk自带的pack升级程序实在烂,那速度,欲死欲仙的。建议大家去keil官网直接下载,然后本地安装比较好。
嗯,就这些心得,与诸君共勉。 |