GD32移植FreeRTOS+CLI过程记录

本文讲述了作者在GD32F303开发板上移植FreeRTOS并集成FreeRTOS-Plus-CLI的过程,包括串口通信、中断处理、任务设计以及自定义echo命令的实现,展示了国产单片机在嵌入式开发中的应用和优化策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

之前我只在STM32F0上基于HAL库和CubeMX移植FreeRTOS,但最近发现国产化替代热潮正盛,许多项目都有国产化器件指标,而且国产单片机确实比意法的便宜,所以也买了块兆易创新的GD32F303开发板,试一试它的优劣。虽然GD32F系列基本都可以和同名的ST单片机pin-to-pin替换,程序也通用,但GD自己也开发了一套库函数,基于GD的库函数开发有利于熟悉GD设计的逻辑,对于未来学习GD的RISC-V单片机也有帮助。另外,不用ST的HAL库,也能降低代码量。

FreeRTOS我们已经很熟悉了,官方又提供了FreeRTOS-Plus库,简化应用的开发。其中FreeRTOS-Plus-CLI,即 command line interpreter,命令行翻译器,可以为运行FreeRTOS的嵌入式设备提供一套命令接口,便于设备在线配置。移植FreeRTOS-Plus-CLI显然对改善嵌入式产品很有帮助。
串口运行输入和输出
(串口运行输入和输出)

GD32串口输入输出和编译器配置

大多数开发板会引出USART0,的通信管脚以便ISP下载。为便于插线,我就直接用USART0进行数据的输入输出,其中输出无需中断,输入可以用中断给出信号量。在系统初始化时,我们应该避免用户输入,故把输入和输出的初始化分开成两个函数:

/*!
    \brief      uart_init function
    \param[in]  none
    \param[out] none
    \retval     none
*/
void uart_init(void)
{
   
    // enable GPIO and USART RCU clock
    rcu_periph_clock_enable(USART0_RCU_PORT); // USART0_RCU_PORT define为串口所在的RCU_GPIOx
    rcu_periph_clock_enable(RCU_USART0);
    
    gpio_init(USART0_PORT,GPIO_MODE_AF_PP,GPIO_OSPEED_50MHZ,USART0_TX_PIN); // USART0_PORT define为串口管脚对应的GPIOx
    gpio_init(USART0_PORT,GPIO_MODE_IN_FLOATING,GPIO_OSPEED_50MHZ,USART0_RX_PIN);
    
    usart_deinit(USART0);
    usart_baudrate_set(USART0,UASRT0_BAUDRATE);
    usart_word_length_set(USART0,USART_WL_8BIT);
    usart_stop_bit_set(USART0,USART_STB_1BIT);
    usart_parity_config(USART0,USART_PM_NONE);
    usart_hardware_flow_rts_config(USART0,USART_RTS_DISABLE);
    usart_hardware_flow_cts_config(USART0,USART_CTS_DISABLE);
    usart_transmit_config(USART0,USART_TRANSMIT_ENABLE);
    
    usart_enable(USART0);
}
/*!
    \brief      uart_recv_init function
    \param[in]  none
    \param[out] none
    \retval     none
*/
void uart_recv_init(void)
{
   
    usart_disable(USART0);
    usart_receive_config(USART0,USART_RECEIVE_ENABLE);
    usart_enable(USART0);
    nvic_irq_enable(USART0_IRQn, 15, 0);
	usart_interrupt_enable(USART0, USART_INT_RBNE);
}

这里有关中断优先级的设置在后面再讲解,此处先按下。在GD官方的许多例程中,都通过重载fputc把标准库函数的输出定向到串口,在我们这里,就按如下定向到USART0:

/* retarget the C library printf function to the USART */
int fputc(int ch, FILE *f)
{
   
    usart_data_transmit(USART0, (uint8_t)ch);
    while(RESET == usart_flag_get(USART0, USART_FLAG_TBE));
    return ch;
}

需要注意的是,标准库太大,直接按默认方式编译可能塞不进单片机中。为此,要在 Options for Targets 中 Target一栏下, Code Generation 卡中做如下设置,启用MicroLIB:
在这里插入图片描述

<think>好的,我需要帮助用户了解如何将FreeRTOS移植GD32微控制器上。用户已经提供了一些引用资料,我需要整合这些信息,并按照系统级指令来组织回答。首先,我需要确保所有的数学表达式和公式使用正确的LaTeX格式,行内用$...$,独立公式用$$...$$。同时,回答必须用中文,结构清晰,分步骤说明,并在适当的位置添加引用标识。 首先,我应该回顾用户提供的引用内容。引用[1]提到移植FreeRTOS版本是202406.01 LTS,并添加了文件。引用[2]详细说明了创建裸机工程和FreeRTOS子文件夹的步骤。引用[3]讨论了FreeRTOS+CLI移植过程,涉及命令行接口和串口配置。 接下来,我需要将移植步骤分解为几个主要部分,比如准备工作、添加文件、配置工程、修改代码、集成CLI等。每个步骤需要简明扼要地说明,并引用对应的来源。同时,需要确保代码块正确使用三个反引号包裹,并注明语言类型。 在生成相关问题部分,要围绕移植过程中的关键点展开,比如性能优化、调试方法、兼容性、CLI集成以及实时性分析等。这些问题应该帮助用户深入理解移植的各个方面。 最后,检查是否所有行内公式和独立公式都正确使用了LaTeX语法,引用标识是否自然添加,回答是否符合用户的要求,结构是否清晰。同时,确认没有使用任何Markdown格式,除了代码块和引用标识。</think>### FreeRTOS移植GD32微控制器指南 #### 一、准备工作 1. **开发环境配置** - 安装ARM-GCC或Keil MDK编译器 - 下载GD32F4xx系列固件库(如GD32F470ZGT6) - 获取FreeRTOS源码(推荐LTS版本,如202406.01[^1]) 2. **工程结构搭建** ```text GD32_Project/ ├── FreeRTOS/ │ ├── include/ # FreeRTOS头文件 │ ├── portable/ # 处理器特定代码 │ └── Source/ # FreeRTOS核心源码 └── GD32_Lib/ # GD32官方驱动库 ``` #### 二、关键移植步骤 1. **添加FreeRTOS文件** - 复制以下核心文件到工程目录: - `FreeRTOS/Source/tasks.c`, `queue.c`, `list.c` - `FreeRTOS/Source/portable/[编译器]/ARM_CM4F`(GD32F470为Cortex-M4核)[^2] 2. **修改链接脚本** 调整栈空间分配,确保FreeRTOS堆内存独立: ```ld _freertos_heap = 0x20020000; # 定义专用堆区域 ``` 3. **实现系统时钟适配** 修改`port.c`中SysTick中断处理: ```c void SysTick_Handler(void) { if(xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED) xPortSysTickHandler(); // FreeRTOS心跳节拍 } ``` #### 三、功能验证 1. **创建测试任务** ```c void vTaskLED(void *pvParams) { while(1) { gpio_bit_write(GPIOA, GPIO_PIN_7, SET); vTaskDelay(pdMS_TO_TICKS(500)); gpio_bit_write(GPIOA, GPIO_PIN_7, RESET); vTaskDelay(pdMS_TO_TICKS(500)); } } ``` 2. **启动调度器** ```c int main(void) { xTaskCreate(vTaskLED, "LED", 128, NULL, 1, NULL); vTaskStartScheduler(); // 启动任务调度 while(1); } ``` #### 四、高级功能扩展 集成FreeRTOS+CLI实现命令行控制[^3]: ```c void CLI_Thread(void *arg) { FreeRTOS_CLIRegisterCommand(&xTaskStatsCommand); for(;;) { char cInput = uart_getchar(); FreeRTOS_CLIProcessChar(cInput); // 处理串口输入 } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值