基本要求
再读这篇文档前,默认大家已经对C语言、linux的线程有所了解,如果不是太熟悉建议先了解一下。可以看看《C程序设计语言》《linux系统编程手册》,
TI和liunx线程不同点
LINUX
Linux 有三种调度策略:分时调度策略(linux默认的调度策略平时常用)、实时调度策略(先到先服务)、实时调度策略(时间片轮转)
分时调度策略:每个线程一视同仁,没有等级高低概念,大家平分时间。
实时调度策略:先到先得,一旦占用cpu则一直运行。一直运行直到有更高优先级任务到达或自己放弃。
实时调度策略:当进程的时间片用完,系统将重新分配时间片,并置于就绪队列尾。放在队列尾保证了所有具有相同优先级的RR任务的调度公平 Linux线程优先级设置。
TI
TI只有一个调度策略:那就是 实时调度策略(先到先服务),先到先得,一旦占用cpu则一直运行。一直运行直到有更高优先级任务到达或自己放弃。俗称抢占式。
小结
之所以开篇就讲区别也是为了后续看代码示例,有个准备,方便快速理解,TI线程使用方式,也可以以避免踩一些坑
TI线程分类
分类简介
TI系统里面有三种线程,分别是:硬中断,软中断,任务。大家目前可以理解为这三个都是线程唯一区别就是他们的优先级不同(三个线程差距比较大,为了快速学习,初学阶段可以认为就是优先级不一样)。
硬中断(HWI)
硬件中断(Hwi)线程。Hwi(也被称为中断服务例程或ISRs)线程是SYS/BIOS中优先级最高的线程,Hwi 线程被用于执行有硬性严格时间要求的任务。这个线程一般不会让上层软件调用的,所以咱们看看就好,基本也用不上
软中断(SWI)
软件中断(Swi)线程。位于Hwi之后的类型,软中断线程产生了Hwi线程和任务线程之间的新的优先级层级。这个软中断线程基本就是上层软件能用到的最高等级线程了。SWI有多达 32个可用的优先级层级(16是默认优先级层级,0-31 ,所以程序里面是15)。
软中断线程一般用于定时器和线程控制。定时器会在规定时间后产生一个线程调用函数,这个线程等级就是软中断等级,平时最好少用定时器做长时间运算,尤其死循环,否则其它线程永远也运行不了,只能等一辈子!!!
任务线程(Task)
任务线程(TASK)就是平时用到的线程。任务线程的优先级高于后台(空闲)线程而低于软件中断。任务不同于软件中断的是它们在执行的过程中可以等待直到必要的资源可被利用。任务为每个线程需要独立 的栈。 SYS/BIOS 提供了用于任务内通信和同步的机制。这些机制包括信号量, 事件,消息队列和邮箱。
TASK也是32个等级(0-31)所以在程序里面等级的数值是15(代表第16级)。
空闲循环(Idle)线程
空闲线程在SYS/BIOS应用中以最低优先级执行并且在一个循环(空闲循环)中一个接一个地被连续被执行,最没有存在感的线程,基本用不上。
线程抢占示意图
HOOK
HOOK并不是线程。Hwi, Swi 和任务线程提供了在一个线程的生命周期中插入用实现仪表,监视或统计数据收集目的的用户代码的可选控制点。每个这样的代码点被称为“ hook ”并且为 hook 提供的用户函数被称为“ hook 函数。
每个线程都有各种状态,注册、创建、就绪、切换、退出和删除,那么钩子函数就可以在这些状态之间运行,以达到检测线程的目的。
hook 函数只能被静态声明(在配置脚本)以便当提供 hook 函数时可被有效的调用。目前看HOOK上层软件也基本用不上。
小结
本章简单介绍了HWI,SWI, TASK 线程等,主要先让大家有个整体概念,有了这些概念,在接下来几章里,看例子就能理解快一些,注意一定要看明白线程抢占示意图!
如果想深入了解这些可以看《SYS BIOS (TI-RTOS 内核) v6.41 用户手册》这里面讲的比较细。
TASK
创建TASK函数
创建一个任务
上图就是个创建一个TASK的基本流程,下面讲一下每行的基本意思和函数的用法。
Task_Params taskParams; Task_Params 里面定义要创建的TASK的属性,比如优先级、堆栈大小、arg0(线程函数第一个参数)、arg1(线程函数第二个参数)。
Task_Handle task0,Task_Handle 存储创建后的TASK的信息,它将作为其它 Task 函数的参数
Error_Block eb,Error_Block用于处理在任务创建期间产生的错误,主要用到eb.msg,eb.msg是个char* 指针里面存储着错误日志,如果出错了可以打印出错的具体信息。
Error_init(&eb), 初始化eb.
Task_Params_init(&taskParams), 初始化taskParams。
taskParams.stackSize = 512; 堆栈设置为512(字节 8位一字节)
taskParams.priority = 15,设置优先级为16级(0-31,从0开始算第一级),不高不低,默认也是这个级数
task0 = Task_create((Task_FuncPtr)hiPriTask, &taskParams, &eb);创建一个task线程,这个线程要执行hiPriTask这个函数,并且线程属性需要满足taskParams里面的信息,出错信息存放在eb里面
当程序执行完上面这些语句线程只是被创建,但是


最低0.47元/天 解锁文章
423





