线程的种类 线程是一组在存储在存储器中的代码,一旦寄存器被正确初始化,CPU就会执行这些代码。线程可以是任何类型的,SYS/BIOS定义了四种线程类型: 硬件中断(HWI),软件中断(SWI),任务(TASK),空闲(Idle)。 硬件中断:时间要求最为严格,要就实时响应的任务:一般为外设和内部的实时时间和定时器模块(定时器模块是通过硬件中断实现的,使用硬件的定时器)。 软件中断:对时间要求较为低的一种中断线程。(时钟模块是基于软件中断模块的定时器模块) 任务:CPU执行的主要线程,和软件中断的区别,可以被阻塞(可以等待) 空闲:优先级最低 各线程有隐式和显示的优先级:隐式优先级是由线程的类型决定的,显示优先级由软件的编程者决定,并且允许抢占的:就是高优先级的线程能够抢线程占低优先级的线程,优先执行,这种高于优先级的调度管理机制保证了最高优先级的线程能在第一时间被执行。下面是线程的抢占的示意图:
线程的创建与配置SYS/BIOS在线程创建和配置方面,提供两种方式,一种是静态的创建,通过XDCtools创建和配置。一种是动态的创建,就是在程序中创建,下面就以HWI为例程,分别列出;两种创建方式:
静态创建:可以通过图形化的界面进行配置,也可以通过JavaScript脚本语言手动编写.cfg文件进行配置,下面写出手动编写.cfg文件配置Hwi: var hwi0Params =new Hwi.Params(); hwi0Params.instance.name= "Uart_Handle"; Program.global.Uart_Handle= Hwi.create(8, "&Int_Uart1ISR", hwi0Params);
动态配置:在程序中进行配置 需要引用的头文件 #include Hwi_HandleUart_Handle; Hwi_Paramshwi0Params; Error_Block eb; Error_init(&eb); Hwi_Params_init(&hwi0Params); hwi0Params.eventId = 85; Uart_Handle =Hwi_craete(8, "&Int_Uart1ISR", & hwi0Params, &eb) ;
任务调度SYS/BIOS任务线程有0-31个优先级(默认0-15,优先级0被空闲线程使用,任务最低优先级为1),但是在内存允许的情况下可以不限制的 创建任务数量。SYS/BIOS有独立的内存堆栈,可以为等待某一事件的发生而被挂起,任务会被其他更高优先级的线程打断。数量和状态可以在程序执行时动 态的更改,优先级也可以动态的修改。 空闲线程是一种非实时性的线程,并且仅当没有任何其它线程(HWI/SWI/TASK运行时才会运行),所有空闲线程运行在同一个线程,而且可以被 其它线程随时抢占,默认使用任务堆栈,如果任务线程被禁用使用系统堆栈,一个接一个运行,每一个空闲线程函数都会从开始执行到结束。所有函数执行完后再从 第一个函数执行,周而复始。 |