rt_thread 移植
闲着没事,发现还有块stm32f429disc的demo板子在吃灰。
就拿来折腾折腾,准备移植个rt-thread玩玩。
上次有在论坛上,下载了个移植了lvgl5.3版本的工程,就在这个
工程上添加吧。省事。
从rt-thread 官网https://www.rt-thread.org/page/download.html
下载rt-thread nano版本,解压文件,发现有5个文件夹,
bsp 板及文件
components/finish shell 移植功能
docs 文档,移植的文档,按照文档移植就OK了。
include 保护的库文件
libcpu 支持的cpu,我们这个工厂是M4核
src 文件师rt-thread 的源文件
移植添加
移植个shell,次功能还是比较好的。添加cmd.c msh.c,shell,c
添加libcpu目录下的cpuport.c
context_rvds.s 文件
rt_src 文件下的文件,添加rt_config.h
文件
添加board.c文件
直接编译,通过
在 rt_hw_board_init()函数里面,
添加
HAL_Init(); //初始化HAL库
SystemClock_Config(); //设置时钟,180Mhz
uart_init( 115200 );
可以打印日志,查看线程等等。
屏蔽掉,it.c里面的 HardFault_Handler() ,PendSV_Handler(),
这些函数由rt-thread实现,控制台输出添加,
kservice.c文件里添加,uart_send(str);
uint16_t i = 0, size = 0;
char a = '\r';
size = rt_strlen(str);
for (i = 0; i < size; i++)
{
while((USART1->SR&0X40)==0);//循环发送,直到发送完毕
USART1->DR = (uint8_t)str[i];
}
添加代码实现打印功能。
\ | /
- RT - Thread Operating System
/ | \ 3.1.3 build Nov 16 2020
2006 - 2019 Copyright by rt-thread team
开机打印OK程序跑起来了。
按照官方文档创建个线程试试吧!
/* 创 建 线 程 1, 名 称 是 thread1, 入 口 是 thread1_entry*/
tid1 = rt_thread_create("thread1",
thread1_entry, RT_NULL,
THREAD_STACK_SIZE,
THREAD_PRIORITY, THREAD_TIMESLICE);
编译提示 Undefined symbol rt_thread_create (referred from main.o).
报错
rt_thread_create 使用的是动态内存方式创建线程,
在rtconfig 里打开,RT_USING_HEAP
编译通过
RT_MAIN_THREAD_STACK_SIZE 配置MAIN线程的栈大小。
RT_MAIN_THREAD_STACK_SIZE 设置的大小对编译的zi-data 没有影响。
board.c 里面的RT_HEAP_SIZE*4 uint32_t类型的*4 堆大小对zi有比较大的影响。
main 线程里的堆栈,也是通过这里的堆空间分配的。
程序下载运行,发现thread1_entry 线程无法运行,THREAD_PRIORITY 官方手册给的是25
而RT_THREAD_PRIORITY_MAX = 8,所以无法运行,下次建议优先级太大,给个报错,
把THREAD_PRIORITY 改小于MAX值,就能正常运行了。
数字越小,优先级越高。
遇到其他问题,程序无法运行可以先把堆栈空间开大一点。
程序跑起来了,led正常翻转。
后面有空继续折腾下。