1 SYS/BIOS简介
SYS/BIOS是一种用于TI的DSP平台的嵌入式操作系统(RTOS)。
2 任务
2.1 任务调度
SYS/BIOS任务线程有0-31个优先级(默认0-15,优先级0被空闲线程使用,任务最低优先级为1,最高优先级为15),在内存允许的情况下可以不限制的创建任务数量。SYS/BIOS有独立的内存堆栈,可以为等待某一事件的发生而被挂起,任务会被其他更高优先级的线程打断。
2.2 动态创建任务
以下例程将动态创造两个任务:
/*
* ======== task ========
*/
Void taskFxn1(UArg a0, UArg a1) {
System_printf("enter task1\n");
Task_sleep(10);
System_printf("exit task1\n");
System_flush();
}
Void taskFxn2(UArg a0, UArg a1) {
System_printf("enter task2\n");
Task_sleep(10);
System_printf("exit task2\n");
System_flush();
}
/*
* ======== main ========
*/
Int main() {
Task_Handle task1;
Task_Handle task2;
Task_Params taskParams;
// 创建两个任务
Task_Params_init(&taskParams);
taskParams.priority = 1;//任务优先级
taskParams.stackSize = 1024;//任务栈大小
task1 = Task_create(taskFxn1, &taskParams, NULL);
Task_Params_init(&taskParams);
taskParams.priority = 2;//任务优先级
taskParams.stackSize = 1024;//任务栈大小
task2 = Task_create(taskFxn2, &taskParams, NULL);
BIOS_start(); /* does not return */
return (0);
}
3 信号量
3.1 信号量原理
信号量通常用于协调一些处于竞争关系的任务之间对共享资源的访问。可以使任务处于挂起状态,用来等待某一个特定的事件,只有当这个事件发布的时候才能继续执行任务。
信号量的操作主要包括Semaphore_pend()
和Semaphore_post()
两个API。Semaphore_pend()
用于请求信号量,如果信号量的计数值大于0,则任务可以继续执行,否则任务将被挂起等待信号量的发布。Semaphore_post()
用于释放信号量,增加信号量的计数值,如果其他任务因等待此信号量而被挂起,则会唤醒这些任务中的一个。
简单来说:信号量的值为0的时候任务处于挂起状态,信号量大于等于1的时候任务恢复继续执行。
信号量有两种模式:计数信号量(Counting)和二进制信号量(Binary)。计数信号量可以有大于1的计数值,表示多个资源或资源的多个访问权限;而二进制信号量只有0和1两个状态,用于最简单的同步机制,比如一个资源的锁定和解锁。下面是两种计数模式的区别: