没有合适的资源?快使用搜索试试~ 我知道了~
首页TI-RTOS CC26xx开发指南:任务、同步与中断
TI-RTOS CC26xx开发指南:任务、同步与中断
需积分: 50 37 下载量 63 浏览量
更新于2024-07-15
2
收藏 3.46MB PDF 举报
本教程是无锡谷雨电子有限公司针对TI-RTOS开发编写的详细指南,主要针对CC26xx平台。发布日期为2017年6月29日,适用于谷雨物联网开发平台。教程内容覆盖了TI-RTOS的核心概念、开发流程和关键功能,共分为九个章节: 1. 第一章 TI-RTOS:介绍什么是TI-RTOS,包括其组成部分,以及如何下载和安装。这一部分指导用户如何在IAR环境中创建RTOS工程,并提供相关的开发资料详情。 2. 第二章 任务:详述任务的基础知识,如任务类型、优先级、状态和堆栈管理。通过实例演示,学习如何创建、删除任务,以及任务抢占和优先级调整。 3. 第三章 任务间同步:讲解信号量、事件、队列和邮箱等同步机制。如何创建和操作这些工具以实现任务间的协调,如二值信号量用于任务控制和互斥访问,事件用于任务等待,队列用于数据传递,邮箱则用于消息传递。 4. 第四章 HWI (硬件中断):介绍了如何创建和配置硬件中断,讨论了硬件中断嵌套和系统堆栈大小,以及与Hwihooks、Register函数等相关内容。 5. 第五章 SWI (软件中断):讲解SWI对象的创建、优先级设置、中断执行过程以及同步Swi函数和Swihooks的使用。 6. 其他章节:包括时间服务、RTOS实验例程说明和APIs列表,这些都是实际开发过程中不可或缺的部分,提供了丰富的实践案例和编程接口。 整个教程旨在帮助开发者理解和掌握TI-RTOS在CC26xx平台上的应用,无论是初学者还是经验丰富的开发人员,都能从中找到所需的信息和实践指导。通过阅读和实践这些内容,用户将能有效地构建和管理复杂的实时操作系统环境。
资源详情
资源推荐
谷雨物联网开发平台 TI-RTOS 开发教程 http://www.iotxx.com
第 14 页 共 86 页
用户创建的任务(TASK)
空闲任务(IDLE)
HWI 也称为中断服务例程或 ISR,在 SYS / BIOS 应用程序中具有最高优先级的线程。 Hwi
任务用于执行时间受到严格的限期的关键任务。 在实时环境中,它是响应外部触发的异步
事件(中断)。详细的硬件中断说明,将在后面进行说明。
SWI 也称为软件中断服务例程。在 SYS/BIOS 中,SWI 任务优先级在 HWI 任务和用户任
务之间。不像 HWI 由硬件中断触发,SWI 是通过调用 SWI 模块 API 方式触发。SWI 允许 HWI
将较少的关键处理推迟到较低优先级的任务中,这样可以最小化 CPU 在中断服务程序中花
费的时间。SWI 需要足够的空间来保存每个 SWI 中断优先级的上下文。
TASK 用户任务,此类型的任务优先级高于系统空闲任务,低于 SWI。TASK 不同于 SWI,
它们在运行过程中,可以被阻塞只到必要的资源可用。TASK 要求每个任务要有自己独立的
栈空间。SYS/BIOS 提供了一些机制用于 TASK 间的同步和通信,它们有信号量(Semphore),
事件(Events),队列(Queue)和邮箱(Mailboxes)。
系统任务之空闲任务。空闲任务运行在最低优先级下。它于用户任务没有什么区别,只
是它由 TI-RTOS 自己创建。当 SYS/BIOS 没有比空闲任务更高的任务运行时,SYS/BIOS 就会执
行空闲任务,并且是连接执行,直到有更高的任务进入就绪状态。
2.2 任务优先级
TI-RTOS 是一个可剥夺型操作系统,其任务的优先级是任务调度算法的基准。所以任务
优先级是比较重要的。
在 SYS/BIOS 中,HWI 有最高优先级。其优先级不能被 SYS/BIOS 维护,它是 CPU 特性决
定。硬件中断也可以被其也的中断抢占,除非全局中断禁用或特定的中能被单独禁用。
SWI 的优先级低于 HWI。它有优先级可以达到 32 级,默认只有 16 级。SWI 可以被更高
优先级的 SWI 和 HWI 抢占,但是 SWI 是不会阻塞的。
Task 的优先级低行 SWI。它的优先级也可以达到 32 级,默认是 16 级。Task 优先级数值
越大,其优先级就越高,0 是优先级最低的。Task 可以被更高优先级 Task 抢占。当 Task 等
待资源时,Task 可以被阻塞。Task 的优先级可以通过 Task_setPri 函数动态的更改。新的优先
级必须在 1 到 TnumPriorities – 1 之间。当新优先级数低于当前优先级时,可能会发生任务切
的换。
空闲任务优先级在所有任务中是最低的。当 CPU 不忙时,空闲任务就会被执行。其运
行在 Task 任务 0 优先级上。
谷雨物联网开发平台 TI-RTOS 开发教程 http://www.iotxx.com
第 15 页 共 86 页
图 1 任务优先级
2.3 任务状态
SYS/BIOS 中 Task 有五种状态,分别 RUNNING,READY,BLOCKED,TERMINATED,INACTIVE
五种。
RUNNING
SYS/BIOS 正在执行的状态
READY
任务处于就绪状态,等待 SYS/BIOS 调度。
BLOCKED
任务处在阻塞状态,即任务不能被执行,可能等待个别事件发生。
TERMINNATED
任务处于终断状态,即不能被 SYS/BIOS 再次调用
INACTIVE
任务非激活状态,即任务的优先级等于-1。任务刚被创建时就于这个状态。可以调用
Task_setPri() API 进行设定。
任务被调度执行是根据任务的优先级。同一时间只能有一个任务处于 RUNNING。非就
绪状态任务优先级大于当前 RUNNING 状态任务优先级,只要此任务处于 READY 状态就会抢
占当前任务。
最大优先级是 Task_numPriorities-1(默认=15,最大=31)。最小优先级是 1。如果优先
级小于 0,此任务将会被禁止执行直到其他任务将其优先级提高大于 0。如果任务的优先级
大于 Task_numProrities-1,此任务不会被其他的 Task 任务抢占。但此任务仍然可以调用
Semaphore_pend(),Task_sleep()或其他一些带有阻塞特性的 API 来阻塞自己,这样可以让低
优先级任务有机会去运行。一个任务的优先级也可以通过调用 Task_setPri()进行更改。
一个任务状态的改变可能有多种原因。
谷雨物联网开发平台 TI-RTOS 开发教程 http://www.iotxx.com
第 16 页 共 86 页
图 2 Task 状态变化图
任务中的函数,Semaphore,Event 和 MailBox 都有可能更改任务的执行状态。阻塞或终
断当前执行任务,就绪之前被挂起的任务,重新调度当前任务等等。
在 SYS/BIOS 有且仅有一个任务处于 Task_Mode_RUNNING。如果所有 Task 都被阻塞或没
有 HWI 和 SWI 运行,SYS/BIOS 将会执行 Task_Idle 空闲任务。当一个任务被 HWI 或 SWI 抢占,
通过调用 Task_state()返回的状态还是 Task_Mode_RUNNING,因为 SWI 或 HWI 释放之后这个
任务还将继续执行。需要注意的地方就是,在空闲任不要执行带有阻塞功能函数,这有可能
导致应用程序终端。
当一个 Task_Mode_RUNNING 状态任务,变更到另外三个状态,可以控制 SYS/BIOS 进行
任务切换任务,去运行就绪状态任务中具有最高优先级的任务。其方法有以下几种。
使运行的任务变成 Task_Mode_TERNINATED,可以通过调用 Task_exit()。
使运行的任务变成 Task_Mode_BLOCKED,可以调用带有阻塞特性函数。例如
Semaphore_pend()或 Task_sleep(),它们有可能挂起当前任务。
使运行的任务变成 Task_Mode_READY,可以使更高优先级任务变成 READY 状态并执行,
便可抢占当前 Task。调用 Task_setPri()函数使当前任务降低优先级。也可以调用
Task_yield()去放弃当前 CPU 时间,使同优先级任务得到运行。
2.4 任务堆栈
任务堆栈是任务重要的组成部分。
所谓堆栈,就是在存储器中按数据 LIFO(后进先出)的原则组织的连续存储空间。为了
满足任务切换和响应中断时保存 CPU 寄存器中内容及任务调用其他函数所需要,每个 Task
都应该配有自己的堆栈。
当任务使用堆栈产生溢出,系统将不可预测,存在致命后果。因此对任务堆栈溢出检查
就显得非常有意义。
在 SYS/BIOS 里提供函数 Task_stat(),可以对任务堆栈空间进行观察。此函数返回的结构
中包含任务堆栈空间大小和栈空间已使用了大小。见下面代码说明。
Task_Stat statbuf; /* declear buffer */
Task_stat(Task_self(),&statbuf); /*call func to get status */
If(statbuf.used > (statbuf.stackSize * 9 / 10))
{
System_printf(“Over 90% of task’s stack is in user.\n”);
}
谷雨物联网开发平台 TI-RTOS 开发教程 http://www.iotxx.com
第 17 页 共 86 页
TI-RTOS 要求任务最小的堆栈空间为 512 个字节。TI-RTOS 有两种方式对任务进行堆栈分
配,第一手动创建数组分配给任务当任务堆栈,第二由任务创建函数动态分配内存,其大小
由 Task_Params.stackSize 成员变量指定。两种分配方式区别是,创建数组方式其内存是应用
程序的堆中分配;而动态分配的内存是在 TI-RTOS 系统堆栈空间中。由于链接文件为 TI-RTOS
分配的堆空间有限,过多的动态分配,将会占用过多的内存空间,而导致其他组件因不能分
配到内存而失败。在实际使用过程中,推荐使用手动创建方式为任务分配堆栈空间。
手动创建数组作为任务堆栈方式如下:
Char task0Stack[512];
……
taskParams.stackSize = 512;
taskParams.stack = &task0Stack;
Task_construct(&task0Struct, (Task_FuncPtr)heartBeatFxn, &taskParams,
NULL);
2.5 创建任务
根据嵌入式系统任务的工作特点,任务的执行代码通常是一个无限循环结构,当然对于
只需执行一次的任务不是这样。同时在这个结构中可以响应中断。下面给出示例。
void UserTask(Uarg a0,Uarg a1)
{
for(;;) //相当于 while(1)
{
//可以被中断的代码
…
…
gateKey = GateHwi_enter(gateHwi);
//临界区,不可以被中断代码
…
…
GateHwi_leave(gateHwi, gateKey);
//可以被中断的代码
…
…
}
}
从 C 程序来看,TI-RTOS 的任务就是一个 C 函数。为了可以传递参数,TI-RTOS 的任务函
数定义了两个参数,这个参数可以被转换成其他类型数据,包括函数指针。
代码中 GateHwi_enter 和 GateHwi_leave 是 TI_RTOS 的 Gates 的一种,用于保护临界区代
码。Gates 还有其他类型,后面将一一介绍。这个两个函数必须成对使用,否则将导致不可
预测后果。在两个函数之间的代码是不会被中断的。
从程序代码的形式上来看,用户任务就是一个 C 函数,但这个函数不是由主函数 main()
剩余86页未读,继续阅读
njuptmjb
- 粉丝: 0
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- C语言快速排序算法的实现与应用
- KityFormula 编辑器压缩包功能解析
- 离线搭建Kubernetes 1.17.0集群教程与资源包分享
- Java毕业设计教学平台完整教程与源码
- 综合数据集汇总:浏览记录与市场研究分析
- STM32智能家居控制系统:创新设计与无线通讯
- 深入浅出C++20标准:四大新特性解析
- Real-ESRGAN: 开源项目提升图像超分辨率技术
- 植物大战僵尸杂交版v2.0.88:新元素新挑战
- 掌握数据分析核心模型,预测未来不是梦
- Android平台蓝牙HC-06/08模块数据交互技巧
- Python源码分享:计算100至200之间的所有素数
- 免费视频修复利器:Digital Video Repair
- Chrome浏览器新版本Adblock Plus插件发布
- GifSplitter:Linux下GIF转BMP的核心工具
- Vue.js开发教程:全面学习资源指南
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功