【CH32X035评估板】--FreeRTOS移植解读与工程使用
[复制链接]
本帖最后由 dirty 于 2024-1-14 14:51 编辑
在官方SDK里已经移植好了FreeRTOS、RT-Thread、HarmonyOS、TencentOS,后三个是国产的了,在使用上差不多一个套路,基本都是任务、消息队列、信号量、互斥量、软件定时器、内存管理等。对有需要使用带系统的可以使用其中之一,在此基础上做应用开发。这里选择FreeRTOS移植做下梳理及系统应用。
一.关于FreeRTOS系统移植
1.FreeRTOS内核源码
官方放在CH32X035EVT\EVT\EXAM\FreeRTOS\FreeRTOS_Core\FreeRTOS路径下,内核版本V10.4.6。文件结构如下:
图1:FreeRTOS文件结构
2.系统移植解读
在FreeRTOS根目录下有两个文件夹①①及C文件③。编号①和③包含的是 FreeRTOS 的通用的头文件和 C 文件,这两部分的文件试用于各种编译器和处理器,是通用的。需要移植的头文件和 C 文件及汇编文件放在编号②portblle 这个文件夹,汇编接口文件一般原厂会对接好。
图2:FreeRTOS下portable目录
在portable\GCC\RISC-V下①port.c与portmacro.h及上下文切换代码汇编portASM.S,官方已经把这些底层移植已做好。②MemMang 文件夹下存放的是跟内存管理相关的,这里选了heap_4.c动态内存分配。
在MounRiver Studio IDE菜单栏Project->Properties里同样已经配置好RiSCV编译器等,开发人员基本不用改动即可直接使用。
二.关于FreeRTOS使用
对于熟悉RTOS使用的小伙伴来说,经常项目工程使用会比较轻车熟路。下面设计创建二值信号量,一个任务里发送信号,一个任务里接收信号,并控制LED1亮灭状态翻转、
1.创建二值信号量
//二值信号量
SemaphoreHandle_t BinarySem_Handle =NULL;
/* 创建 BinarySem */
BinarySem_Handle = xSemaphoreCreateBinary();
if (NULL != BinarySem_Handle)
{
printf("BinarySem_Handle Create OK\r\n");
}
else
{
printf("BinarySem_Handle Create Fail\r\n");
}
2.任务处理
任务2发送信号量
void task2_task(void *pvParameters)
{
BaseType_t xReturn = pdPASS;/* 定义一个创建信息返回值,默认为 pdPASS */
while(1)
{
xReturn = xSemaphoreGive( BinarySem_Handle );//给出二值信号量
if ( xReturn == pdTRUE )
{
printf("\r\nGive BinarySem_Handle OK!\r\n");
}
else
{
printf("\r\nGive BinarySem_Handle Fail!\r\n");
}
vTaskDelay(2000);
}
}
任务1接收信号量并控灯
void task1_task(void *pvParameters)
{
uint8_t led_status;
while(1)
{
//获取二值信号量 xSemaphore,没获取到则一直等待
if(xSemaphoreTake(BinarySem_Handle,portMAX_DELAY)==pdTRUE)//
{
printf("Take BinarySem_Handle OK \r\n");
led_status=GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_0);
GPIO_WriteBit(GPIOA, GPIO_Pin_0, (led_status == 0) ? (led_status=Bit_SET):(led_status=Bit_RESET));
printf("Led Toggle!\r\n");
if(led_status)
{
printf("now led_status OFF\r\n");
}
else
{
printf("now led_status ON\r\n");
}
}
}
}
3.编译烧录,查看日志及LED灯状态
图3:FreeRTOS运行日志
可以看到 信号量的发送与接收以及任务键执行情况,LED灯亮灭状态切换。至此FreeRTOS得到成功应用。
|