166_FreeRTOS任务创建例程学习

         这部分内容是官方文档中的例程1的学习、调试以及简单的修改尝试。从内容看,主要的目的是简单展示一下如何创建一个Task。

         首先,看一下其中一个Task的原型设计。

         三个要素:1,范围void;2,接收的参数是void *;3,函数中一个死循环。

         接下来,再看一下创建的方式:

         创建Task的方式也有几个要素,主要是传入参数。第一个是Task的函数名称;第二个是用不到的Task的名字,这个没有什么实质的作用,只是辅助调试;第三个是堆栈;第四个是参数;第五个是优先级;第六个是一个handle,用于任务处理。

         按照文档内容描述,这或许是OS里面比较难的一个接口。其实,简单分析熟悉一下之后,本质上到时也么有看到什么难点。不过,这个参数数量确实是很客观,我自己的软件设计中函数很少超过5个参数。

         接下来看一下默认运行效果:

         顺便按照我自己的理解,看看做几个改变是否是可以出现我预期的效果。首先,我加大Task 1的执行时间,这样理论上来说Task1的打印数目会减少。代码修改如下:

执行效果如下:

        

         从执行结果看,达到了预期的效果。之后,我再改一下优先级试一下看。我把Task 1的时间加到很大,同时让它拥有更高优先级。理论上说的话,可能会出现打印Task1之后,Task2的出现会等待一会儿的情况。

代码修改:

执行效果:

         从执行效果看,似乎task 1占用了全部的CPU资源,一直是Task 1在打印。对换优先级,可以看到最终Task2一直打印。这里,有些概念还是不好区分,尤其是关于调度的说明,不过从这个效果上,至少可以看出优先级的作用了。

### FreeRTOS任务创建示例 #### 动态方法创建任务 通过`xTaskCreate()`函数可以动态地创建一个新的任务。此函数会自动分配所需的内存来存储任务的TCB(任务控制块)和堆栈。 ```c // 定义任务处理程序 void vTaskCode(void *pvParameters) { // 无限循环的任务主体 while (1) { // 执行任务逻辑... // 添加必要的延时或其他同步操作 vTaskDelay(pdMS_TO_TICKS(100)); } } // 创建任务 { const TickType_t xTicksToWait = pdMS_TO_TICKS(10); // 超时时间设置为10ms BaseType_t xReturned; // 使用默认优先级和其他配置参数创建任务 xReturned = xTaskCreate( vTaskCode, /* 指向任务入口点的指针 */ "TASK", /* 名字作为字符串常量 */ configMINIMAL_STACK_SIZE,/* 堆栈深度 */ NULL, /* 参数传递给任务 */ tskIDLE_PRIORITY, /* 任务优先级 */ NULL /* 不需要返回句柄 */ ); } ``` 上述代码展示了如何定义一个简单的任务并利用`xTaskCreate()`将其加入到系统的调度当中[^2]。 #### 静态方法创建任务 对于资源受限的应用场景,推荐采用静态方式创建任务以避免潜在的内存碎片化问题。这可以通过调用`xTaskCreateStatic()`完成: ```c #define STACK_SIZE 128 / portBYTE_ALIGNMENT // 准备用于保存任务上下文的空间 StackType_t ucStack[STACK_SIZE]; StaticTask_t xTaskBuffer; // 定义任务处理程序 void anotherTaskHandler(void *pvParameters); // 创建静态任务 { TaskHandle_t xCreatedTask; xCreatedTask = xTaskCreateStatic( anotherTaskHandler, "STATIC_TASK", STACK_SIZE, NULL, tskIDLE_PRIORITY, ucStack, &xTaskBuffer ); if(xCreatedTask != NULL){ // 成功创建任务 } else { // 处理错误情况 } } ``` 这段代码说明了怎样预先分配好足够的空间供特定任务使用,并通过`xTaskCreateStatic()`把它们注册进FreeRTOS内核中去[^3]。 #### 主要流程概述 在一个典型的嵌入式应用程序里,通常会在主函数(main())里面执行如下几个步骤: - 初始化外设; - 构建初始任务集合——这些可能是应用的核心功能模块或是辅助性的管理型工作单元; - 删除任何临时性质的任务实例; - 开启多任务环境下的进程切换机制即启动调度器[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值