rtthread源码下载https://github.com/RT-Thread/rt-thread.git
一、仅跑个core调度和基础组件
rtt库代码比较大,因为有充足的案例。本次使用的stm32f4在库上就有example。只是想看看rtt本身核心代码有哪些。因此在cubmx生成的裸板文件上进行修改与粘贴。
├── Core
│ ├── Inc
│ └── Src
├── Drivers
│ ├── CMSIS
│ │ ├── Device
│ │ │ └── ST
│ │ │ └── STM32F4xx
│ │ │ ├── Include
│ │ │ └── Source
│ │ │ └── Templates
│ │ └── Include
│ └── STM32F4xx_HAL_Driver
│ ├── Inc
│ │ └── Legacy
│ └── Src
├── rtthread
│ ├── bsp
│ │ └── f407test
│ │ └── src
│ ├── include
│ ├── libcpu
│ │ └── arm
│ │ ├── common
│ │ └── cortex-m4
│ └── src
└── startup
Core是APP代码,Drivers是标准开源HAL库,startup中存储着.s,外侧则是cmakelists以及ld文件。
主要是增加了rtthread文件夹,其中src和include是rtthread的核心代码,从源码直接复制。
libcpu是复制exapmple中的m4相关。涉及上下文切换,中断管理。
bsp文件夹是板级资源,如堆栈空间大小,以及主频资源初始化等。同时需要实现rt_hw_board_init。从rtthread的entry以及案例来看,rtthread将entry作为入口,在entry中extern了main,因此在reset_handler中将bl main更改为了bl entry。entry中将main作为线程进行处理,main中应该是纯业务。而需要实现的rt_hw_board_init才是硬件初始化。
之前裸板的while(1)更改为main函数,初始化部分变为rt_hw_board_init。
中途因为heap没有初始化,同时define了RT_USING_HEAP,导致么起来。
主要测试了一下跑起来rtthread进行debug,没有重写rt_print这类的。
即使在源码中,为什么USE_RTOS为0?
不过在kputs中已经增加了互斥,这儿串口互斥的use_rtos应该也是没有作用了的。
二、增加终端
终端输入输出是需要增加的项。
增加复制component下的FINSH组件,同时需要增加RT_USING_CONSOLE相关的宏,FINSH、MSH作为输入交互也需要添加。二进制应该增大了10k左右。
同时ld文件需要增加一个保留段,佛则CMD宏增加的INIT函数都不会被调用,是无效的。
实现uart的驱动,重写rt_hw_console_output和rt_hw_console_getchar。就完成了串口交互功能。
这里有点乱的原因是(shell->echo_mode)时换行使用了\n,windows下需要换成\r\n后就能正常显示换行了。或者更改客户端设置,像mobaxterm如下更改。
三、增加RT_USING_DEVICE
device设备框架也是rt-thread的重要特性。增加device后,需要增加较多文件,同时不再使用之前的裸机串口打印方式。
复制了component下的serial组件,提供了统一设备管理接口;复制了单板侧的drv_usart进行单板级的串口适配。
完成适配后串口命令字可以看到挂上的设备。