Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread学习营
RT-Thread移植笔记
发布于 2018-08-17 04:56:04 浏览:5253
订阅该版
本移植过程基于学习营给出的第0个basic例程,硬件平台为STM32H743。 basic工程是面向stm32l4的,首先把工程里关于l4的文件换了吧(唉,尽干了些苦力活)。 换了相关文件之后,就是这幅样子。当然,除了替换相关文件之外,还修改了里头的时钟配置(不修改编译都编过不去),还有里头本来就有的串口初始化函数。 ![Image.png](/uploads/201808/17/044448ph7udv004zvz7e3p.png) 编译是没错,但有用没用呢,试一下,把USART和LED部分改一改,看能不能出效果 ![Image1.png](/uploads/201808/17/044445t0hqi272khim310m.png) 唉,看样子没啥大问题,LED在闪,串口也在打印。 在rt_hw_board_init()函数中把系统时钟开了 `HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/RT_TICK_PER_SECOND);` 加上系统时钟中断服务函数 ```c void SysTick_Handler(void) { rt_interrupt_enter(); rt_tick_increase(); rt_interrupt_leave(); } ``` 使用HAL库时,还需要完善HAL_Delay函数,RT-Thread操作系统中是直接填入rt_thread_delay() ```c void HAL_Delay(__IO uint32_t Delay) { rt_thread_delay(1000/RT_TICK_PER_SECOND); return ; } ``` 个人见解:这个函数这样处理会存在一些隐患,RT-Thread是默认自动初始化外设及系统组件的,HAL_Delay这个函数常见与HAL库的各个角落,也包括外设初始化函数中;外设初始化的时候RT-Thread系统并没有运行起来,rt_thread_delay()这个函数实质是把线程挂起休眠,初始化阶段哪来的线程,自然而然就会陷入RT_ASSERT判断,从而执行死循环。 查阅RT-Thread的编程手册,发现手册里面给了一个高精度延时的例程,或许融合起来会更安全一下 ```c void HAL_Delay(__IO uint32_t Delay) { if(rt_thread_self()==RT_NULL) { Delay = Delay * (SysTick->LOAD/(1000/RT_TICK_PER_SECOND)); rt_uint32_t delta = SysTick->VAL; while (delta - SysTick->VAL< Delay); } else rt_thread_delay(1000/RT_TICK_PER_SECOND); return ; } ``` RT-Thread在初始化过程中会打印logo和系统版本,现在已经调试出了串口,但是到现在都没打出系统logo ![Image2.png](/uploads/201808/17/044445i52lapwjeqzl5hzk.png) RT-Thread在没有打开RT_USING_DEVICE的情况下,有一种替补操作用于控制台打印信息。 深究`rt_kprintf`函数会发现一些东西 ```c void rt_kprintf(const char *fmt, ...) { va_list args; rt_size_t length; static char rt_log_buf[RT_CONSOLEBUF_SIZE]; va_start(args, fmt); length = rt_vsnprintf(rt_log_buf, sizeof(rt_log_buf) - 1, fmt, args); if (length > RT_CONSOLEBUF_SIZE - 1) length = RT_CONSOLEBUF_SIZE - 1; #ifdef RT_USING_DEVICE if (_console_device == RT_NULL) { rt_hw_console_output(rt_log_buf); } else { rt_uint16_t old_flag = _console_device->open_flag; _console_device->open_flag |= RT_DEVICE_FLAG_STREAM; rt_device_write(_console_device, 0, rt_log_buf, length); _console_device->open_flag = old_flag; } #else rt_hw_console_output(rt_log_buf); #endif va_end(args); } RTM_EXPORT(rt_kprintf); ``` 在没有打开`RT_USING_DEVICE`宏定义的状态下,`rt_kprintf`函数会使用`rt_hw_console_output`函数进行输出。 ```c RT_WEAK void rt_hw_console_output(const char *str) { /* empty console output */ } RTM_EXPORT(rt_hw_console_output); ``` 但是这个函数并没有进行定义,而且用了weak进行弱化,那就可以在外部进行定义,程序自然会进行调用,但是怎么写这个函数呢,在rt_kprintf中所有要输出的内容都用rt_vsnprintf函数进行了格式化,所以rt_hw_console_output函数只需要实现字符串输出即可。 ```c void rt_hw_console_output(const char *str) { RT_ASSERT(str != RT_NULL); while(*str != '\0') { if(*str == '
') { if(*(str-1) != ' ') bsp_uart_send(' '); } bsp_uart_send(*str++); } } ``` ![Image3.png](/uploads/201808/17/044445bco93xkg2oxso9gn.png) RT-Thread实现了优秀的内存管理算法,但移植到现在都没有实现,或许该试试实现内存管理了。 板卡并没有外挂多大的RAM,所以只要实现RTT中的小内存管理就行了。 仔细研读RT-Thread的代码可以发现,RTT并没有固定HEAP的起始地址,而是借助了代码的存储结构和分布装载描述文件来实现的(我也不知道我理解的对不对,`Image$$RW_IRAM1$$ZI$$Limit`这玩意查了很久),在board.h文件中HEAP_BEGIN定义为`(Image$$RW_IRAM1$$ZI$$Limit)`取地址。 ![Image4.png](/uploads/201808/17/044445jwcujljmtj78mcqz.png) 在board.c中调用`rt_system_heap_init`函数进行堆初始化好像成功了,程序并没有死,但是还有待进一步测试。 哎,好使! ![Image5.png](/uploads/201808/17/044445itpten6wtnnnwz0e.png) RT-Thread还有一大组件就是Finsh,命令行功能强大,怎么能不去实现呢。 Finsh的实现需要有字符设备支持 将Finsh组件加入工程.... 呃,basic这个工程没有相关文件,那就从憋出考过来,例如第四个工程finsh 将components文件夹拷贝到rt-thread文件夹下,再添加进工程。 需要打开如下宏定义,否则会报一大堆错误 ```c #define RT_USING_DEVICE #define RT_USING_DEVICE_IPC #define RT_PIPE_BUFSZ 512 #define RT_USING_SERIAL #define BSP_USING_UART3 #define RT_USING_FINSH #define FINSH_THREAD_NAME "tshell" #define FINSH_USING_HISTORY #define FINSH_HISTORY_LINES 5 #define FINSH_USING_SYMTAB #define FINSH_USING_DESCRIPTION #define FINSH_THREAD_PRIORITY 20 #define FINSH_THREAD_STACK_SIZE 4096 #define FINSH_CMD_SIZE 80 #define FINSH_USING_MSH #define FINSH_USING_MSH_DEFAULT #define FINSH_ARG_MAX 10 ``` 编译之后发现还是有错误 ![Image6.png](/uploads/201808/17/044446dz292k899bcaf2x1.png) 这是因为缺少了文件 从`chapter11\4-finsh t-thread\src`文件夹中将device.c拷贝到`0-basic t-thread\src`文件夹中,并加入工程,编译,零错误,零警告。 ![Image7.png](/uploads/201808/17/044447l7cxrb3c323rbx3m.png) 这就行了吗?? 并不是,刚才添加的是`device.c`,负责像上层提供统一的接口,现在的工程还缺少一份硬件驱动代码。 常用的硬件驱动代码,rtt已经做的非常完善,并不需要再重新写一遍。 从`chapter11\4-finsh\drivers`文件夹中将usart.c和usart.h文件拷贝至`0-basic\drivers`文件夹,并加入工程 ![Image8.png](/uploads/201808/17/044447lbnhndwn5bzp8zaw.png) 这份驱动代码已经支持USART1~USART5,只需要打开相应的宏,并检查引脚是否匹配即可。 如需自动初始化并进行设备注册,在文件结尾加上`INIT_BOARD_EXPORT(stm32_hw_usart_init);`即可。 什么?下载进去没有用?? 没用就对了,因为还没进行初始化呀 在`rt_hw_board_init`函数中加上`rt_components_board_init`进行初始化, 加上`rt_console_set_device(RT_CONSOLE_DEVICE_NAME);`进行设备绑定,然后就如下图了。 ![Image9.png](/uploads/201808/17/044447ldif1ihf0hwi3iwz.png) 输入命令试试 ![Image10.png](/uploads/201808/17/044448mrsiaqha2greeapq.png) 完成!!!
查看更多
1
个回答
默认排序
按发布时间排序
whj467467222
认证专家
2018-08-17
开源,分享,交流,共同进步
厉害
撰写答案
登录
注册新账号
关注者
1
被浏览
5.3k
关于作者
Y_JESSE
这家伙很懒,什么也没写!
提问
1
回答
0
被采纳
0
关注TA
发私信
相关问题
1
stm32f407+lan8720 lwip2.0 作业提交
2
玩溜GD32303E-EVAL BSP系列(五)----设备连接网络
3
onenet应用连不上云端
4
【文件系统】晴天文件匹配
5
rtt semc sdram 基于操作系统怎么初始化驱动设备
6
RT-Thread内核移植+LoIIs+STM32F103C8+StdLib
7
EVN编译报错,求助大神
8
【内核和外设学习营】十里 简单LED闪亮测试
9
【内核和外设学习营】 十里 串口指令控制RGB灯点亮的颜色
10
【内核和外设学习营】 十里 PWM单色呼吸灯实验
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
RT-Thread项目助手v0.2.0 - 支持Env Windows
2
RttreadV5.10上,GD32F450Z RTC时间显示问题
3
rt-smart启动流程分析
4
EtherKit快速上手PROFINET
5
RTThread USB转串口无法接收数据
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
PWM
cubemx
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
813
个答案
177
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
149
次被采纳
本月文章贡献
出出啊
1
篇文章
2
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
3
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部