1685|2

502

帖子

0

TA的资源

纯净的硅(初级)

楼主
 

【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得到成功应用。

 

 

最新回复

有关FreeRTOS的使用主要是创建二值信号量,确实如此的   详情 回复 发表于 2024-1-15 07:49
点赞 关注
个人签名

保持热爱

 
 

回复
举报

6809

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

有关FreeRTOS的使用主要是创建二值信号量,确实如此的

点评

是的,关于系统方面是比较范式的用法,按需使用。  详情 回复 发表于 2024-1-17 22:21
 
 
 

回复

502

帖子

0

TA的资源

纯净的硅(初级)

板凳
 
Jacktang 发表于 2024-1-15 07:49 有关FreeRTOS的使用主要是创建二值信号量,确实如此的

是的,关于系统方面是比较范式的用法,按需使用。

个人签名

保持热爱

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表