djyos 发表于 2010-1-11 15:01:17

如何配置djyos,以EKK8962板为例

嵌入式产品,几乎每一款都是独特的,而且许多情况下资源还是很紧张的,设计者希望高效利用有限的资源,这样,操作系统的配置就非常重要,合理的配置,能够使操作系统既能满足应用需求,又降低flash和内存消耗。按默认配置的版本,资源开销如下:
    Total ROSize (Code + RO Data)                23800 (23.24kB)
    Total RWSize (RW Data + ZI Data)             10128 (   9.89kB)
    Total ROM Size (Code + RO Data + RW Data)      24220 (23.65kB)
上述数据未包含流水灯事件、shell事件、uart守护事件和键盘守护事件所需要的运行栈。

1、djyos的目录结构
\djyos\si-------------------------------------------------------------总目录
\djyos\si\djyos-----------------------------------------------------所有不需要移植的内核代码
\djyos\si\arch------------------------------------------------------所有需要移植的内核代码
\djyos\si\arch\cortex-m3----------------------------------------cortex-m3的公共代码
\djyos\si\arch\cortex-m3\luminary-------------------------------Ti公司的m3的公共代码
\djyos\si\arch\cortex-m3\luminary\ekk8962-----------------------ekk8962板子的代码
\djyos\si\prj-ekk8962-------------------------------------------应用程序工程目录
\djyos\si\prj-ekk8962\include\config-prj.h----------------就它了,操作系统的裁剪就是由这个文件控制的。
\djyos\si\prj-ekk8962\*.scat------------------------------keil版本的链接配置文件,修改它可以改变异常和中断的栈尺寸。

2、配制方法
把配置放在工程目录中,有一个好处,就是不同的工程,对操作系统的组件有不同的要求,只要改自己目录下的config-prj.h文件就可以了,操作系统代码可以保持不变。

djyos的配置是通过定义各种常量来实现的,下面分组说明这些常量的含义。

2.1配置主频
同一个板子,应用于不同工程时,主频可能不同,在这里配置。
#define M   1000000
#define cn_mclk         (50*M)      //主频
#define cn_fclk         cn_mclk   //cm3自由运行外设时钟
#define cn_xtal         cn_rcc_xtal_8mhz        //主振频率

#define cn_tick_ms      1       //操作系统内核时钟脉冲长度,以毫秒为单位。
#define cn_tick_hz      1000    //内核时钟频率,单位为hz。
#define cn_fine_us      1       //操作系统内核精密时钟脉冲长度,以微秒为单位。
                              //它表示从上一次tick脉冲开始至今流逝的时间量。
#define cn_fine_hz      1000000 //内核精密时钟频率,是cn_fine_us的倒数。

2.2配置内核组件
djyos中事件控制块、锁控制块等所需要的内存是静态分配的,合理配置下列常数,能够很好地控制内存消耗。
#define cn_device_limit   20   //定义设备数量。
#define cn_handle_limit   20   //定义设备句柄数量。
#define cn_locks_limit      20   //定义程序中可用的自由锁的数量。自由锁指用户
                //调用semp_creat和mutex_create创建的锁,不包括嵌入到设备中的锁。
#define cn_events_limit   32   //事件数量
#define cn_evtts_limit      16   //总事件类型数
#define cn_wdt_limit      5      //允许养狗数量
#define cn_mem_pools      10   //允许建立10个内存池
#define cn_int_num          48   //lm3s8962有48个中断源
这些常数的含义及对内存开销的影响如下:
可创建设备数量:20,设备控制块开销1200字节。
可同时打开设备数量:20,设备句柄开销400字节
可使用的锁的数量:20,包含信号量和互斥量,锁控制块开销800字节。
事件数量:20,即事件队列中未处理完毕的事件数量上限,开销1680字节
事件类型数量:16,即应用程序登记的事件类型上限,开销1152字节
看门狗数量:5,即允许应用程序创建的看门狗数量上限,开销380字节
内存池数量:10,除从堆中分配外,djyos还提供类似ucosii的“批发-零售”式内存分配功能,内存池控制块开销800字节。
中断数量:48,中断控制块开销1344字节。注意,这里指的是lm3s8962版本能够支持的最大中断号,不是应用程序实际使用的中断数量。
用户可以根据自己工程的特点,灵活配置这些常量,控制资源消耗。例如,应用程序不需要那么多设备,就可以减少设备数量。

2.3配置外部组件和外设驱动
各常量中,1表示需要该组件,0表示不需要该组件。
#define cfg_keypad          1   //是否包含键盘驱动
#define cfg_djyfs         0   //是否包含文件系统
#define cfg_djyfs_flash   0   //是否包含flash文件系统的驱动
#define cfg_djyfs_ram       0   //是否包含ram文件系统
#define cfg_nude_terminal   0   //nude terminal是一个在启动时提供最基本的人机
#define cfg_uart0_used      1   //通过ftdi转成usb串口
#define cfg_uart1_used      0   //
#define cfg_uart2_used      0   //

除上述所列的配置项目外,还有一些其他项目,但这些项目不建议用户修改,除非有特殊需要。

3、配置栈
djyos for cortex-m3中,应用程序使用psp栈指针,异常和中断使用msp栈指针。异常和中断栈的尺寸配置为1K,如果应用程序的ISR没有用到这么多的栈,也可以通过修改链接配置文件(arm的术语叫分散加载文件),以节省内存。
    heap_top 0x20010000-0x400 EMPTY 0
    handle_msp +0 EMPTY 0x400
这句中,0x20010000是lm3s8962内存最高地址+1,0x400是异常和中断的栈尺寸,改动这个参数即可。

sunmy 发表于 2010-1-31 20:52:54

顶!
也座个沙发感觉下哈

zzwuyu 发表于 2010-1-31 20:56:23

呵呵,顶一下。希望以后也能形成一个类似开源社区的组织,一起讨论,互相进步

a___________a 发表于 2010-2-9 19:57:12

DJY目前支持几个编译器,目前是不是Keil

djyos 发表于 2010-2-9 20:00:46

V0.4.1以前是gcc,之后是keil,精力有限,只能维护一种版本。

tdmi 发表于 2010-2-10 07:43:15

LZ能不能上传一个在EKK8962跑的KEIL例程,这样感觉上手更快点啊

djyos 发表于 2010-2-10 08:41:44

在本版下载帖 http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3866965&bbs_page_no=1&bbs_id=3065 中就有啊
页: [1]
查看完整版本: 如何配置djyos,以EKK8962板为例