添加内核源码

  1. 首先任意打开一个官方样例工程,我们就用上一节创建的InputOutput样例
    HTV5工程界面
  2. 双击project,使用MDK打开
  3. 因为MDK默认是没有下载rtthread的,所以我要先去下载
    注意:我们用的rtthread nano版,只要内核就行了,MDK是提供了下载的
    HTMDK包下载按钮
  4. 进入包下载界面
    HTMDK包下载界面
    找到RT-Thread包,然后点击install
    等待下载完成,退出包下载界面
  5. 然后点击,管理运行环境按钮
    HTMDK管理运行环境按钮
  6. 得到如下界面,我们可以从这里添加一些组件到我们的工程中。
    HTMDK运行环境管理界面
  7. 通过上图,我们发现了RTOS里面有三个内容,我们现在只要kernel,也就是内核,内外两个之后会说。device(设备管理,但是nano,是没有设备管理的,但是官方其实给了两个设备移植的例程,现在不管),shell(终端,用来看内核运行情况,线程,信号等等,也可以打log)
    勾选kernel即可,然后就会在我们工程目录,看到添加了对应的内核文件
  8. 下图为勾选内核后的工程目录
    Thread内核后的工程目录
    可以看到工程目录的最下面是我们添加的RT-Thread内核

配置内核源码

  1. 首先打开ht32f5xxxx_01_it.c,因为RT-Thread已经复写了HardFault_Handler和PendSV_Handler函数,所以我们要把本文件下面的两个函数屏蔽,注释掉就行。
    Thread内核后的工程目录
    Thread内核后的工程目录
  2. 然后把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();
    }
    
  3. 在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
    }
    
  4. 内存堆初始化,主要是为了使用动态内存功能,如使用rt_malloc,rt_free以及各种动态创建对象的API,要使用的话,打开RT_USING_HEAP宏即可
    注意:开启了heap后,要注意RT_HEAP_SIZE大小,如果小了,但是创建线程和内存会存在失败的情况
  5. 经过上面的步骤,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);
	}
}