【GD32L233C-START评测】Part2:从零开始移植RTThread
[复制链接]
1.介绍
为了后续Demo做准备,移植RTThread,为什么不移植FreeRTOS呢?因为国产芯片就应该用国产系统!那么就开始吧!
2.移植准备
上一篇的工程【https://bbs.eeworld.com.cn/thread-1194440-1-1.html】
RTThread3.15的Keil离线包:https://www.rt-thread.org/download/mdk/RealThread.RT-Thread.3.1.5.pack
3.开始移植
直接把内核和shell一块移植了。
安装上面RTThread3.15的Keil离线包,打开上一篇的工程。
图1
打开工程,添加RTThread内容,操作如下图2所示。
图2
添加完成之后,在旁边的工程目录可以看到如下文件。
图3
首先选择【rtconfig.h】文件进行一些参数的配置修改内容如下所示。
//Main线程的大小,256不够所以修改成了256
#define RT_MAIN_THREAD_STACK_SIZE 512
//打开控制台
#define RT_USING_CONSOLE
//添加控制台头文件
#include "finsh_config.h"
需要修改一些中断和时钟,修改结果如下图4所示。
图4
由于Shell需要自己实现输入和输出函数,分别是【rt_hw_console_getchar】和【rt_hw_console_output】。【rt_hw_console_getchar】在【finsh_prot.c】文件中已经有一个虚函数,不过为了方便管理,就不修改这个函数了,直接在【board.c】文件中添加这个函数,同时修改【board.c】文件的【rt_hw_console_output】函数。结果如下:
#include "gd32l233r_eval.h"
void rt_hw_console_output(const char *str)
{
//#error "TODO 3: Output the string 'str' through the uart."
rt_enter_critical();
while (*str!='\0')
{
if (*str=='\n')
{
usart_data_transmit(EVAL_COM, '\r');
while (usart_flag_get(EVAL_COM, USART_FLAG_TC) == RESET);
}
usart_data_transmit(EVAL_COM, *str++);
while (usart_flag_get(EVAL_COM, USART_FLAG_TC) == RESET);
}
rt_exit_critical();
}
char rt_hw_console_getchar(void)
{
/* Note: the initial value of ch must < 0 */
int ch = -1;
//#error "TODO 4: Read a char from the uart and assign it to 'ch'."
if(usart_flag_get(EVAL_COM, USART_FLAG_RBNE) != RESET)
{
ch = usart_data_receive(EVAL_COM);
}
return ch;
}
同时还需要修改时钟的初始化位置,将【systick_config()】初始化移动到【board.c】文件中的【rt_hw_board_init】函数中,结果如下:
#include "systick.h"
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.
*/
/* Call components board initial (use INIT_BOARD_EXPORT()) */
systick_config();
#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
}
然后修改【main】函数,只让它输出时钟信息,如下所示:
int main(void)
{
/* print out the clock frequency of system, AHB, APB1 and APB2 */
rt_kprintf("\r\nCK_SYS is %d", rcu_clock_freq_get(CK_SYS));
rt_kprintf("\r\nCK_AHB is %d", rcu_clock_freq_get(CK_AHB));
rt_kprintf("\r\nCK_APB1 is %d", rcu_clock_freq_get(CK_APB1));
rt_kprintf("\r\nCK_APB2 is %d\n", rcu_clock_freq_get(CK_APB2));
return 0;
}
最后注释掉一些【#error】即可。
下载程序到开发板上,运行【free】和【free】命令,得到如下图5。
图5
4.总结
其实系统移植很简单,官方也有相应的教程,不过跑系统还是比较好的,可以实现很多裸机不好实现的功能,后续就在这个代码基础上增加外设功能了。
|