RT_thread移植

一、为什么要使用操作系统

当我们进入嵌入式这个领域的时候, 往往首先接触的都是单片机编程, 单片机编程又首选 51 单片机来入门。 这里面说的单片机编程通常都是指裸机编程,即不加入任何 RTOS(Real Time Operation System 实时操作系统) 的程序。 常用的 RTOS 有国外的 FreeRTOS、μC/OS、 RTX 和国内的 RT-Thread、 Huawei LiteOS 和 AliOS-Things 等, 其中尤以国外开源且免费的 FreeRTOS 的市场占有率最高。

在裸机系统中,所有的程序基本都是自己写的, 所有的操作都是在一个无限的大循环里面实现。现实生活中的很多中小型的电子产品用的都是裸机系统, 而且也能够满足需求。但是为什么还要学习 RTOS 编程,偏偏还要整个操作系统进来。一是项目需要,随着产品要实现的功能越来越多,单纯的裸机系统已经不能够完美地解决问题,反而会使编程变得更加复杂,如果想降低编程的难度, 我们可以考虑引入 RTOS 实现多线程管理, 这是使用RTOS 的最大优势。二是学习的需要,必须学习更高级的东西,实现更好的职业规划,为将来走向人生巅峰迎娶白富美做准备,而不是一味的在裸机编程上面死磕。作为一个合格的嵌入式软件工程师,学习是永远不能停歇的事,时刻都得为将来准备。

二、RT_thread的移植

准备工作:

1.准备一个工程(LED灯,按键,USART,系统定时器等驱动)

2.准备RT_thread的源码

解压过后的源码:

bsp--文件保存的板级支持包,支持不同的芯片

components--包含了一些组件信息 finsh--用于调试打印,在终端上显示调试信息(使用到底层的串口资源)

include--包含的都是头文件

libcpu--和底层硬件相关的库函数

src--内核源码

1、将压缩包中的内容全部复制到工程中

复制到如下位置:

修改名字3.0.3为rt_thread

复制如下文件到工程中的user目录中:

打开工程添加分组:

rtt_src添加的的是系统中SRC文件中的内容:

添加rtt_port分组,:

添加头文件:

编译代码,编译完成之后,修改错误:

..\User\rtconfig.h(6): error: #5: cannot open source input file "RTE_Components.h": No such file or directory

注释掉此头文件(如果不能修改,查看文件属性,进行修改)

重复定义:

.\Objects\BH-F103.axf: Error: L6200E: Symbol HardFault_Handler multiply defined (by context_rvds.o and stm32f10x_it.o). .\Objects\BH-F103.axf: Error: L6200E: Symbol PendSV_Handler multiply defined (by context_rvds.o and stm32f10x_it.o). .\Objects\BH-F103.axf: Error: L6200E: Symbol SysTick_Handler multiply defined (by board.o and delay.o).

SysTick_Handler:

2、rtconfig.h文件的修改:

修改优先级和系统定时器

修改栈区空间:

打开信号量和事件、互斥

使能堆区:

3、修改board.c文件

此文件中操作系统和底层硬件的链接部分,比如系统定时器

需要先将board.c文件添加到rtt_src分组

首先我们先来看内核中的系统定时器地址:

core_cm3.h

SysTick_BASE 地址--0xe000e010

再看OS中的,定时器地址:

4、void rt_hw_board_init()

包含了我们底层设备的驱动信息

修改:注释掉或者删除

添加初始化内容:

三、添加一个board.h

路径和Board.c一样

编译代码,查看有没有错误:

四、验证工程可用性

#include <rtthread.h> #include <rthw.h> #include "board.h" void LED1_Pthread(void *para); rt_thread_t led1_thread; int main(void) { //创建线程--LED led1_thread=rt_thread_create("led1",LED1_Pthread,NULL,128,5,20); if(led1_thread !=RT_NULL) { rt_thread_startup(led1_thread); } while(1) { } return 0; } void LED1_Pthread(void *para) { while(1) { LED1ON(); rt_thread_delay(500); rt_kprintf("led1 running!!\r\n");//将打印信息输出到我们的串口助手中 LED1OFF(); rt_thread_delay(500); } }

五、finsh组件:

FinSH 是 RT-Thread 的命令行组件,提供一套供用户在命令行调用的操作接口,主要用于调试或查看系统信息。它可以使用串口 / 以太网 / USB 等与 PC 机进行通信。

用户在控制终端输入命令,控制终端通过串口、USB、网络等方式将命令传给设备里的 FinSH,FinSH 会读取设备输入命令,解析并自动扫描内部函数表,寻找对应函数名,执行函数后输出回应,回应通过原路返回,将结果显示在控制终端上。

使用以下函数的前提,必须配置好串口1的驱动:

rt_kprintf--修改此函数的打印方向:

void rt_hw_console_output(const char *str) { /* 进入临界段 */ rt_enter_critical(); /* 直到字符串结束 */ while (*str!='\0') { /* 换行 */ if (*str=='\n') { USART_SendData(USART1, '\r'); while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); } USART_SendData(USART1, *str++); while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); } /* 退出临界段 */ rt_exit_critical(); }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值