如何创建RT-Thread Nano工程

描述

  GD32L233C-START评测系列

兆易创新GD32L233系列全新低功耗MCU的最高主频为64MHz,集成了64-256KB的嵌入式eFlash和16-32KB的SRAM,以及连接到两条APB总线的各类增强型I/O和外设资源。芯片持续采用行业领先的Arm Cortex-M23内核,通过精简强大的Armv8-M指令集和全面优化的总线设计带来高效处理能力,包含独立的乘法器和除法器,广泛适用于工业表计、小型消费电子设备、便携式医疗设备、电池管理系统、数据采集与传输等典型市场。

评测主角:GD32L233C-START 评估板 使用 GD32L233CCT6 作为主控制器,使用 GD-Link Mini USB 接口提供 5V 电源,提供包括扩展引脚在内的及Reset、Boot、Button key、LED、USB、USART 转 USB 接口等外设资源。下载程序到评估板需要使用 GD-Link 工具,所有例程提供了Keil 和IAR 两个版本。            

移植RT-Thread至GD32L233

本文将尝试使用国产的嵌入式实时操作系统RT-Thread,相比较于FreeRTOS,RT-Thread还是有很多有点的,比如有Fish命令行界面,国产开源免费,Nano版本代码量极小,移植起来非常简单(比freeRTOS移植还简单)等,本文将讲解如何将RT-Thread Nano移植到GD32L233C。

一、获取RT-Thread基于KEIL的离线安装包

https://www.rt-thread.org/download/mdk/RealThread.RT-Thread.3.1.5.pack

下载之后双击安装即可。

二、添加RT-Thread Nano到工程

1. 打开我们自己的工程,在我的GD32L233C的第二篇帖子中,讲解了如何创建一个全新的工程,本文将会在上一篇创建的工程的基础上添加RT-Thread OS,观看上一篇帖子请移步:http://bbs.eeworld.com.cn/thread-1192155-1-1.html

2. 点击 Manage Run-Time Environment,展开RTOS,勾上kernel

RT-Thread

3. 点击OK,我们可以看到KEIL已经自动为我们添加了Cortex-M23相关的内核源码,这点还是很方便,很人性化的,不用我们在手动修改了。

RT-Thread

查看官方的文档堆各个文件都有具体的描述:

RT-Thread

三、修改文件适配Rt-Thread

我们需要修改HardFault_Handler() 和 PendSV_Handler(),这两个文件是由RT-Thread实现的,所以我们工程里面原来的这两个函数都需要删除掉,屏蔽掉这两个函数的申明和定义:

RT-Thread

RT-Thread

四、修改系统时钟

RT-Thread已经为我们写好了时钟节拍函数rt_os_tick_callback(), 在board.c文件中,我们只需要将这个函数放置到SysTick_Handler()中即可,注意需要删除SysTick_Handler()中的原有内容。

RT-Thread

删除rt_hw_board_init()函数中的#error信息,这个函数在board.c文件中,其目的是提醒用户移植的时候不要忘了心跳节拍的移植,这点还是很人性化的,免得移植了半天发现不工作。

RT-Thread

 五、修改时钟节拍

RT-Thread为我们提供的配置文件的时钟节拍是1000,也就是1ms,如果你想要修改心跳节拍,可以在rtconfig.h中修改这个宏RT_TICK_PER_SECOND,目前是1000,如果想修改节拍为10ms,则修改该值为10000,修改的时候最好不要直接修改rtconfig.h这个文件,因为KEIL提供了配置界面修改,在配置界面修改安全可靠。

RT-Thread

六、创建线程测试移植是否成功

经过了上面的步骤,我们的移植已经算是完成了,接下来就是写程序验证了,像上一篇帖子一样,我们写两个LED动作的线程,LED1 100ms闪烁一次,LED2500ms闪烁一次来做对比,别忘了修改LED灯的引脚,上一篇帖子已经说明白了,引脚不对,需要我们自己修改,如下:

RT-Thread

在main.c中写两个线程,如下:

 

#include "gd32l23x.h"#include "systick.h"#include #include "main.h"#include "gd32l233r_eval.h"#include 

static rt_thread_t led1_thr = RT_NULL;static rt_thread_t led2_thr = RT_NULL;
static void thread_led1_entry(void *parameter);static void thread_led2_entry(void *parameter);
/*!    rief      main function    param[in]  none    param[out] none    
etval     none*/
int main(void){    /* configure systick */    systick_config();    /* initilize the LEDs, USART and key */    gd_eval_led_init(LED1);    gd_eval_led_init(LED2);
    led1_thr = rt_thread_create( "led1",     /*线程名字*/                                                      thread_led1_entry,/*线程入口函数*/                                  RT_NULL,/*线程入口函数参数*/                                  256,    /*线程栈大小*/                                  4 ,    /*线程优先级*/                                  20);   /*线程时间片*/    led2_thr = rt_thread_create( "led2",     /*线程名字*/                                                      thread_led2_entry,/*线程入口函数*/                                  RT_NULL,/*线程入口函数参数*/                                  256,    /*线程栈大小*/                                  3 ,    /*线程优先级*/                                  20);   /*线程时间片*/        rt_thread_startup (led1_thr);    rt_thread_startup (led2_thr);
    while(1)     {        rt_thread_mdelay(100);    }}
static void thread_led1_entry(void *parameter){    while (1)    {        gd_eval_led_toggle(LED1);        rt_thread_mdelay(100);    }}
static void thread_led2_entry(void *parameter){    while (1)    {        gd_eval_led_toggle(LED2);        rt_thread_mdelay(500);    }}

 

编译成功下载,发现程序并不运行,这是为什么呢?通过堆问题的查找,发现是main函数线程的堆栈空间分配的太小了,因为相比较于其他嵌入式系统,RT-Thread将main函数也做为了一个线程,我们在main函数中创建线程需要较大的空间,而RT-Thread给的默认配置的main线程的堆栈空间为256,修改为512即可:

RT-Thread

再次编译下载,成功,后期可以使用RT-Thread来开发多线程任务了。

七、演示

原文标题:GD32L233开发板评测 | RT-Thread操作系统移植

文章出处:【微信公众号:GD32MCU】欢迎添加关注!文章转载请注明出处。

  审核编辑:彭菁
 

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分