【带你认识 RT-Thread】RT-Thread Nano 移植

1.准备工作

       在了解了 RT-Thread Nano 源码目录结构和启动流程后就可以进行代码移植工作了,如果对此不清楚,请参考《【带你认识 RT-Thread】初识 RT-Thread》这篇博文。RT-Thread Nano 已集成在 Keil MDK 中,可以直接在 IDE 中进行下载添加,本博文介绍了如何使用 MDK 移植 RT-Thread Nano。在进行移植前需要准备一个裸机工程,作者基于 NXP LPC54101 建立了一个通过串口一秒钟打印一次 hello world 的裸机工程。移植完成后应用代码还能正常运行说明移植成功。
       应用代码如图 1 所示,在 main 函数中初始化系统时钟、UART,在主循环中实现一秒打印一次 hello world。为了简化工程,延时使用的是软件延时的方法。在添加 RT-Thread Nano 后,将替换为系统专用延时函数。



       图 2 是串口打印的数据。

2.添加源码

       在验证过裸机工程可以正常运行后就可以向工程中添加 RT-Thread Nano 源码,关于目录、文件、函数以及对象的命名可以参考 RT-thread 编程风格(https://github.com/RT-Thread/rt-thread/blob/master/documentation/coding_style_cn.md) 。添加源码步骤如下:

       (1)使用 Keil 打开裸机工程,如图 3 所示点击 Pack Installer 按钮,在右侧的 Pack 窗口下找到 RealThread::RT-Thread,安装最新版本。



       (2)如图 4 所示点击 Manage Run-Time Environment 按钮,展开 RTOS ,勾选 kernel 以向工程中添加源码


       完成上面两步后工程目录中会多出 RTOS 这一项,其中 context_rvds.s、cpuport.c 为芯片内核移植代码,board.c、rtconfig.h 为系统配置文件,其它的都是 Nano 内核源码。

3.系统配置

       将时钟、外设的配置移到 rt_hw_board_init 函数下,由 RT-Thread 启动流程可知系统启动时会调用该函数来初始化硬件。

 

       编译工程,下载运行后发现串口不能正常打印 hello world,作者 debug 后发现是因为系统分配给 main 线程(此时 main 函数已经作为系统的一个线程在运行)的空间过小导致的。将系统配置文件 rtconfig.h 下的  RT_MAIN_THREAD_STACK_SIZE 宏定义改成 512,串口即可正常打印数据。

       最后将 main 函数下的 delay_1s 延时函数换成系统延时函数rt_thread_mdelay,同时需要添加 rtthread.h 头文件。这两个延时函数的区别在于调用前者,处理器会直到延时结束才会去执行其它的代码,又由于 main 线程是一个循环,没有释放处理器使用权的动作,这样比 main 线程优先级低的线程永远得不到执行。而调用后者 main 线程随机释放处理器使用权,使得低优先级的线程可以得到执行,延时结束后再申请处理器使用权。这正是操作系统与裸机的本质区别!

【参考资料】

RT-Thread 文档中心(https://www.rt-thread.org/document/site/#)

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论