[5-1-1]_创建任务_声光色影

一、任务的核心要素:函数、栈、优先级

  1. 做何事:函数
  2. 每个任务都有自己独享的栈(TCB和栈可以malloc动态分配,也可以事先静态分配)
  3. 扩展:优先级

1、TCB简介:

任务被切换出去之后,要再次找到该任务的步骤:

从某个链表中找到任务A。。。

链表中存放任务结构体TCB

2、动态分配和静态分配创建任务

可以静态或者动态分配,所以对应两套函数。

静态:事先准备好栈和结构体

动态:动态分配栈和TCB结构体

3、创建任务——声光色影

 freertos.c创建默认任务

只用了栈的大小,没有分配内存空间,用到的是动态分配

driver_ir_receiver.c遥控接收控制函数

 freertos.c创建新任务——声(动态分配)

1、任务句柄

2、创建任务

3、分辨返回值

 freertos.c创建新任务——光(静态分配)

1、函数类型

2、通过数组给函数提供栈buffer

 PS:仅代表首地址,故还需在创建任务时指定数组长度;

3、静态分配任务结构体指针

4、任务创建

5、返回句柄

 freertos.c创建新任务——色

函数、栈buffer、结构体指针TCB

 freertos.c创建新任务——影

4、估算栈的大小

栈用来保存返回地址和其他寄存器、局部变量和保存现场

可以选取最复杂的调用关系来评估栈的大小

如对于一个5级调用来说,要用36字节来保存:

栈的示意图如下: 

*以声音播放举例估计栈的大小:

5、使用任务参数

实现让同一个函数,创建不同的任务,通过不同的任务参数,让这些任务执行不同的操作

  1. 不同任务的栈不同,那么生成的局部变量就有各自的版本
  2. 如果两个任务访问的是全局变量,就要考虑互斥

1、LCD打印函数(可传递不同的参数)

函数参数 (在不同位置打印)

2、使用全局变量来避免打印过程中被打断导致的乱序

避免打印过程所占比例过大,导致切换到的全局变量为0(LCD被某一任务大比例的占用),所以加入时间延迟

6、删除任务

在默认创建任务的函数中实现音乐播放任务的创建和删除 

 

PS:句柄和返回值的定义 

点删除任务后,蜂鸣器保持一个音调,需加上停止蜂鸣器函数

Q:频繁的创建、删除任务好吗?有什么坏处

1、频繁的创建删除容易形成内存碎片

2、删除任务后还需要关闭蜂鸣器,需要后续的清理操作

一般在同一个任务中,通过按键实现蜂鸣器的开启和关闭,而不是使能蜂鸣器的开启任务和删除蜂鸣器 的开启任务

7、改善播放效果

(1)提高播放任务的优先级

  • 提高优先级方法:在创建任务时,把播放音乐任务的优先级加1 ;
  • 存在的问题:优先级高的任务在收到遥控器传来的信号后没有主动放弃CPU资源;
  • 会影响到其他任务当用遥控启动任务后,其他任务不再执行。

(2)使用vTaskDelay改进延迟:

vTaskDelay在延迟的过程中不参与调度

既保持了播放效果,同时也不影响其他任务

Q:怎么确定栈的大小

Q:互斥的访问LCD?使用全局变量

Q:32位和八位有什么区别?

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值