HT32F52352移植RT-Thread系列教程2-MDK移植
添加内核源码
- 首先任意打开一个官方样例工程,我们就用上一节创建的InputOutput样例

- 双击project,使用MDK打开
- 因为MDK默认是没有下载rtthread的,所以我要先去下载
注意:我们用的rtthread nano版,只要内核就行了,MDK是提供了下载的

- 进入包下载界面

找到RT-Thread包,然后点击install
等待下载完成,退出包下载界面 - 然后点击,管理运行环境按钮

- 得到如下界面,我们可以从这里添加一些组件到我们的工程中。

- 通过上图,我们发现了RTOS里面有三个内容,我们现在只要kernel,也就是内核,内外两个之后会说。device(设备管理,但是nano,是没有设备管理的,但是官方其实给了两个设备移植的例程,现在不管),shell(终端,用来看内核运行情况,线程,信号等等,也可以打log)
勾选kernel即可,然后就会在我们工程目录,看到添加了对应的内核文件 - 下图为勾选内核后的工程目录

可以看到工程目录的最下面是我们添加的RT-Thread内核
配置内核源码
- 首先打开ht32f5xxxx_01_it.c,因为RT-Thread已经复写了HardFault_Handler和PendSV_Handler函数,所以我们要把本文件下面的两个函数屏蔽,注释掉就行。


- 然后把SysTick_Handler函数,写到board.c中去,所以ht32f5xxxx_01_it.c也要注释掉
注意:这里是关键,只有添加了这个函数,那么RT-Thread系统才能跑起来,这个单片机的时钟时一样的,表示心脏// board.c /* cortex-m 架构使用 SysTick_Handler() */ /* 这里表示了每次Systick产生中断,rt_tick加一,这样就能保证系统的实时性,可运行性 */ void SysTick_Handler(void) { rt_os_tick_callback(); } - 在board.c中实现系统时钟配置(为MCU,外设提供时钟)和OS tick配置(为操作系统提供心跳/节拍)
/** * This function will initial your board. */ void rt_hw_board_init(void) { // #error "TODO 1: OS Tick Configuration." /* * TODO 1: OS Tick Configuration * Enable the hardware timer and call the rt_os_tick_callback function * periodically with the frequency RT_TICK_PER_SECOND. */ /* OS Tick 频率配置,RT_TICK_PER_SECOND = 1000 表示 1ms 触发一次中断 */ SysTick_Config(SystemCoreClock / RT_TICK_PER_SECOND); NVIC_SetPriority(SysTick_IRQn,0x00); /* Call components board initial (use INIT_BOARD_EXPORT()) */ #ifdef RT_USING_COMPONENTS_INIT rt_components_board_init(); #endif #if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP) rt_system_heap_init(rt_heap_begin_get(), rt_heap_end_get()); #endif } - 内存堆初始化,主要是为了使用动态内存功能,如使用rt_malloc,rt_free以及各种动态创建对象的API,要使用的话,打开RT_USING_HEAP宏即可
注意:开启了heap后,要注意RT_HEAP_SIZE大小,如果小了,但是创建线程和内存会存在失败的情况 - 经过上面的步骤,rtthread nano就移植完了
验证
修改mian函数,让开发板上的闪烁
// main.c
#include "rtthread.h"
int main(void)
{
// 这个是串口输出的
RETARGET_Configuration();
// 初始化LED1,对应开发板上的LED1
HT32F_DVB_LEDInit(HT_LED1);
/* Infinite loop to read data from input pin and then output to LED */
while (1)
{
// 打开LED1
HT32F_DVB_LEDOn(HT_LED1);
// 调用RT-Thread的延时函数,如果调用成功,说明一直成功
rt_thread_mdelay(500);
// 关闭LED1
HT32F_DVB_LEDOff(HT_LED1);
rt_thread_mdelay(500);
}
}
- 感谢你赐予我前进的力量
赞赏者名单
因为你们的支持让我意识到写文章的价值🙏
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 活着死去
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果

