您的位置:首页 > 其它

uC/os-ii在MDK下使用心得

2015-06-09 14:41 162 查看
还是上次那个lwip+ucos-ii的项目,因为整个功能已经基本实现,那么最后一步就是优化注释了,因此也就有了这篇关于MDK的使用心得。

1. MDK使用技巧

(1)、对于仅修改少部分文件,按F7(build)编译当前文件链接即可,不需要rebuild。如果build也是全部编译的话,勾掉options -> output下的Create Batch File即可。

(2)、MDK格式缩进,选中段,按TAB则段整体右移,按SHIFT + TAB则整体左移。

(3)、底层硬件驱动对端口进行写入和写出时中间添加延时函数__nop()(注意前面是2个'_');增加程序在高频下的兼容性(具体

参考datesheet,过长可能会时序错误)。

(4)、对于编译成功的项目希望查看占用的RAM和ROM大小

项目编译成功后会显示如下图




Code: 代码 70308B

RO-data: 只读变量97608B

RW-data:可读写变量 3808B

ZI-data: 未初始化变量66192B

则占用RAM( RW-data + ZI-data) :70000byte(68.36kB)

占用ROM(Code+ RO-data+RW-data):168992byte(165.03KB)
实际上大于上面3项之和,为什么呢?

选择Options -> Listing -> Linker Listing ->Memorey map(勾上),编译完成点开生成.map文件,

就可以清晰看出来:



ROM中还包含代码中的数据(值为5868),不过现在ROM比代码大的多,至少256KB都够用,而且一部分固定代码(像网页,字库可以额外配spi存储器W25X16,把数据移入就行,因此不用担心,倒是RAM特别需要注意,不满足记得更换

芯片啊。

2 .uC/os-II配置技巧

即然上面讲诉的主要是存储占用相关的信息,而RAM内存一般都是紧缺的,那么这里我就主要讲一下uC/OS-ii堆栈的配置,说到堆栈的配置,这里要讲下uC/os-ii压栈机制了。当任务切换时,uC/os-ii会将一层层的函数地址压栈直到当前执行的语句,也就是说深度是与调用的层次有关的,uC/os -ii也提供了合理的机制可以自由决定任务堆栈的大小,并提供了函数OSTaskStkChk用于堆栈深度测试,先不说这个函数,这里我会讲诉一个更简单更准确的方法来让你确定堆栈的大小。

选择Options -> Listing -> Linker Listing ->Callgraph勾上,编译完成点开生成的htm文件,就可以看到需要执行线程的堆栈,



可以知道堆栈深度为516 + unkown byte;

则我们选择的堆栈就是640byte(部分冗余,防止溢出),又因为OS_STK被定义为int

那么我们#define App_TaskStartStk 160 //640/4 即可

如此便可以配置堆栈到合适的范围,避免浪费和出错

上面说的堆栈配置需要完成大部分项目,在优化的时候才能做,因为深度是与代码息息相关的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: