本帖最后由 lvhuayi 于 2016-2-24 15:34 编辑
首先感谢这次由爱板网等相关各方赞助并发起的GD32设计大赛活动。GD32系列MCU作为较罕见的国产MCU产品表现出了很高的品质,特别是GD32F207ZET6芯片为基于Cortex-M3内核的通用MCU属于一款较高端的产品。 目前国产的RTOS更是百花齐放,既有本次活动的发起者之一trochiliOS,还有RT-Thread、SylixOS、djyos、raw-os、uTenux等等。在这里选择了uTenux移植到小红板。 uTenux实时操作系统是由大连悠龙软件公司以基于TRON标准的T-Kernel精简版本uT/Kernel为核心开发的,主要针对ARM系列微控制器从ARM7/9至Cortex M系列。在大连悠龙的官网上有关于uTenux的具体介绍,这里不再过多说明。 接下来,对uTenux的移植进行介绍。
根据GD32F207ZE小红板自带的软件(GD32-Colibri-F207ZE-DEMO)我们看到其已经对小红板的led、uart、key等给出了BSP(目录board中),因此这对方便我们移植起到了帮助。本次移植要实现led点亮和uart打印输出的功能以帮助测试uTenux。 从悠龙公司官网下载uTenux的源码包,目前最新版的uTenux为V2.0.00r400版,本移植工作就是针对这一版本进行。解压下载的源码包,可以在其中看到有uTenux的内核文件(source)、说明文件(manual)、代码示例(sample)等多个文件夹。其中uTenux与具体芯片无关的内核文件位于目录/source/uTenux/uTOS中,可将其整体复制到准备新建的工程中使用。
采用Keil MDK 5.16a工具进行移植开发工作。建立的文件目录如图所示,其中
uTOS中存放为上述的uTenux与具体芯片无关的内核文件; Obj中为建立的keil工程文件; GD32F207ZET6中为小红板的所有硬件相关文件; App中为用户主程序和任务应用程序;
实现uTenux在小红板上的移植主要是对tk_config_depend.h、tm_monitor.c和startup_gd32f20x.s三个文件进行修改。
tk_config_depend.h中定义了所移植芯片的一些参数,以及对uTenux的配置参数,具体设置可以参考文件《uTOS内核移植指南_uTenux_uTOS_Porting_Guide_C》; tm_monitor.c中主要是用于uTenux输出信息的一些函数,需要对其与小红板BSP进行适配修改,这里只需小的修改就可和小红板自带DEMO中colibri_bsp_uart.c文件中的函数进行替换; startup_gd32f20x.s中为小红板的启动文件,是汇编语言写的。这里需要将sysTick和PendSV所对应的中断处理函数替换为uTenux所提供的函数;- Stack_Size EQU 0x400
- AREA STACK, NOINIT, READWRITE, ALIGN = 3
- Stack_Mem SPACE Stack_Size
- __initial_sp
- ;// <h> Heap Configuration
- ;// <o> Heap Size (in Bytes) <0-4096:8>
- ;// </h>
- Heap_Size EQU 0x200
- AREA HEAP, NOINIT, READWRITE, ALIGN = 3
- __heap_base
- Heap_Mem SPACE Heap_Size
- __heap_limit
- IMPORT knl_dsp_entry [WEAK]
- IMPORT knl_int_tckhdr [WEAK]
- PRESERVE8
- THUMB
- ; Vector table entries with the exceptions ISR address
- AREA RESET, DATA, READONLY
- EXPORT __Vectors
- EXPORT __Vectors_End
- EXPORT __Vectors_Size
- __Vectors DCD __initial_sp ; Top of Stack
- DCD Reset_Handler ; Vector Number 1,Reset Handler
- DCD NMI_Handler ; Vector Number 2,NMI Handler
- DCD HardFault_Handler ; Vector Number 3,Hard Fault Handler
- DCD MemManage_Handler ; Vector Number 4,MPU Fault Handler
- DCD BusFault_Handler ; Vector Number 5,Bus Fault Handler
- DCD UsageFault_Handler ; Vector Number 6,Usage Fault Handler
- DCD 0 ; Reserved
- DCD 0 ; Reserved
- DCD 0 ; Reserved
- DCD 0 ; Reserved
- DCD SVC_Handler ; Vector Number 11,SVCall Handler
- DCD DebugMon_Handler ; Vector Number 12,Debug Monitor Handler
- DCD 0 ; Reserved
- ;DCD PendSV_Handler ; Vector Number 14,PendSV Handler
- ;DCD SysTick_Handler ; Vector Number 15,SysTick Handler
- DCD knl_dsp_entry ; Vector Number 14,knl_dsp_entry
- DCD knl_int_tckhdr ; Vector Number 15,knl_int_tckhdr
复制代码 uTenux启动任务的过程为: main()->initctsk()->usermain()->App_TaskCreate()->App_TaskStart() 这里建立三个用户任务:tsk_id_LED_R;tsk_id_LED_G;tsk_id_LED_Y分别点亮三个LED并通过uart输出相应的信息。 以上就是对在小红板上移植uTenux的阶段总结。目前移植工作还未完成,存在任务启动后没有输出信息的问题,正在进一步解决中,所以就先不上传代码了。还是先把作业交了占个位置吧。 TRON标准是国际上嵌入式领域OS开发的一个标准,因此这里对uTenux进行了研究和移植。当然对于RTOS还是要根据开发工作的需要进行选择。对于学习而言更推荐参考资料全面的trochiliOS,它有和小红板配套的教材《嵌入式实时操作系统原理与最佳实践》。毕竟RTOS的原理基本是类似的,一通百通吗。
|