【CH32X035评估板】--FreeRTOS移植解读与工程使用
本帖最后由 dirty 于 2024-1-14 14:51 编辑<p> 在官方SDK里已经移植好了FreeRTOS、RT-Thread、HarmonyOS、TencentOS,后三个是国产的了,在使用上差不多一个套路,基本都是任务、消息队列、信号量、互斥量、软件定时器、内存管理等。对有需要使用带系统的可以使用其中之一,在此基础上做应用开发。这里选择FreeRTOS移植做下梳理及系统应用。</p>
<p>一.关于FreeRTOS系统移植</p>
<p>1.FreeRTOS内核源码</p>
<p> 官方放在CH32X035EVT\EVT\EXAM\FreeRTOS\FreeRTOS_Core\FreeRTOS路径下,内核版本V10.4.6。文件结构如下:</p>
<div style="text-align: center;">
<div style="text-align: center;"></div>
<p> </p>
</div>
<div style="text-align: center;">图1:FreeRTOS文件结构</div>
<p>2.系统移植解读</p>
<p> 在FreeRTOS根目录下有两个文件夹①①及C文件③。编号①和③包含的是 FreeRTOS 的通用的头文件和 C 文件,这两部分的文件试用于各种编译器和处理器,是通用的。需要移植的头文件和 C 文件及汇编文件放在编号②portblle 这个文件夹,汇编接口文件一般原厂会对接好。</p>
<div style="text-align: center;">
<div style="text-align: center;"></div>
<p> </p>
</div>
<div style="text-align: center;">图2:FreeRTOS下portable目录</div>
<p> 在portable\GCC\RISC-V下①port.c与portmacro.h及上下文切换代码汇编portASM.S,官方已经把这些底层移植已做好。②MemMang 文件夹下存放的是跟内存管理相关的,这里选了heap_4.c动态内存分配。</p>
<p> </p>
<p> 在MounRiver Studio IDE菜单栏Project->Properties里同样已经配置好RiSCV编译器等,开发人员基本不用改动即可直接使用。</p>
<p> </p>
<p>二.关于FreeRTOS使用</p>
<p> 对于熟悉RTOS使用的小伙伴来说,经常项目工程使用会比较轻车熟路。下面设计创建二值信号量,一个任务里发送信号,一个任务里接收信号,并控制LED1亮灭状态翻转、</p>
<p>1.创建二值信号量</p>
<pre>
<code>//二值信号量
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");
}
</code></pre>
<p>2.任务处理</p>
<p>任务2发送信号量</p>
<pre>
<code>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);
}
}</code></pre>
<p>任务1接收信号量并控灯</p>
<pre>
<code>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");
}
}
}
}
</code></pre>
<p>3.编译烧录,查看日志及LED灯状态</p>
<p> </p>
<div style="text-align: center;"></div>
<div style="text-align: center;">图3:FreeRTOS运行日志</div>
<div style="text-align: center;"> </div>
<p> 可以看到 信号量的发送与接收以及任务键执行情况,LED灯亮灭状态切换。至此FreeRTOS得到成功应用。</p>
<div style="text-align: center;"> </div>
<p> </p>
<p>有关FreeRTOS的使用主要是创建二值信号量,确实如此的</p>
Jacktang 发表于 2024-1-15 07:49
有关FreeRTOS的使用主要是创建二值信号量,确实如此的
<p>是的,关于系统方面是比较范式的用法,按需使用。</p>
页:
[1]