对于多任务,甚至多核的操作系统,需要访问共同的系统资源。共享资源包括软件资源和硬件资源,软件共享资源主要是共享内存,包括共享变量、共享队列等等,硬件共享资源包括一些硬件设备的访问,例如:输入/输出设备。为了避免多个任务访问共享资源时相互影响甚至冲突,需要对共享资源进行保护,有下列几种处理方式:开关中断、信号量(semphore)、互斥量(mutex)。
开关中断:一般用于单核平台多任务之间的互斥,通过关闭任务的调度,从而达到单任务访问共享资源的目的。缺点是会影响中断响应时间。
信号量:多任务可以通过获取信号量来获取访问共享资源,可以配置信号量的数目,让多个任务同时获取信号量,当信号量无法获取时,相关任务会按照优先级排序等待信号量释放,并让出CPU资源;缺点是存在高低任务优先级反转的问题。
互斥量:任务也是通过获取mutex来获取访问共享资源的门禁,但是单次只有一个任务能获取到该互斥量。互斥量通过动态调整任务的优先级来解决高低优先级反转的问题。
本章节介绍AliOS Thngs上的信号量接口。
API 列表
aos_sem_new()
创建信号量对象
aos_sem_free()
删除信号量对象
aos_sem_wait()
请求一个信号量
aos_sem_signal()
释放一个信号量
aos_sem_is_valid()
判断信号量对象是否有效
aos_sem_signal_all()
释放信号量,并唤醒所有阻塞在该信号量上的任务
使用
添加该组件
信号量是AliOS Things 默认添加的组件,开发者无需再手动添加。
包含头文件
#include
使用示例
示例说明:当前任务创建一个信号量和子任务,并等待子任务释放信号量。
static aos_sem_t g_sem_taskexit_sync;
unsigned int stack_size = 1024;
int ret = -1;
....
static void task1(void *arg)
{
....
/*释放信号量*/
aos_sem_signal(&g_sem_taskexit_sync);
....
}
/*当前任务:创建信号量,信号量初始count为0*/
ret = aos_sem_new(&g_sem_taskexit_sync, 0);
if (ret != 0) {
printf("sem create fail