手把手建立信号量管理硬件资源
线程的是实现项目的功能,那么我们在处理功能时总不可能让一个任务一直占用CPU,如果我们要同时进行多项任务时。硬件的保持已经做好,如何管理这些线程,让不同的任务同时处理,最大化利用cpu呢?这时就可以使用信号量来方便的管理多个资源(相同作用),我们可以认为信号量标志着书架中存放书本的个数,每个书本可以完成一个任务,信号量的大小标志了书本的多少,还能运行多少个任务。
一、声明自己的信号量(告诉代码,我要创建一个书架)
在官方文档的main.c函数里定义消息队列控制块(下面的操作同样处于main.c文件中),位于定义全局变量的位置。格式为
static rt_sem_t test_sem = RT_NULL;/*test_sem是信号量名,可更改。
二,在主函数中创建信号量。
计数信号量(创建)
test_sem = rt_sem_create("test_sem",/* 计数信号量名字 */
5, /* 信号量初始值,默认有5个信号量 */
RT_IPC_FLAG_FIFO); /* 信号量模式 FIFO(0x00)*/
if (test_sem != RT_NULL)
rt_kprintf("计数信号量创建成功!\n\n");
信号量标志,它可以取如下数值: RT_IPC_FLAG_FIFO 或 RT_IPC_FLAG_PRIO |
计数信号量(初始化)
rt_sem_init(rt_sem_t sem,
const char *name,
rt_uint32_t value,
rt_uint8_t flag)
flag | 信号量标志,它可以取如下数值: RT_IPC_FLAG_FIFO 或 RT_IPC_FLAG_PRIO |
sem | 信号量对象的句柄 |
value | 信号量初始值 |
二值信号量
/* 创建一个信号量 */
test_sem = rt_sem_create("test_sem",/* 信号量名字 */
1, /* 信号量初始值,默认有一个信号量 */
RT_IPC_FLAG_FIFO); /* 信号量模式 FIFO(0x00)*/
if (test_sem != RT_NULL)
rt_kprintf("信号量创建成功!\n\n");
三、信号量怎么用
rt_err_t rt_sem_take (test_sem,time);/*获取一个信号量
获取信号量 “拿走一个书本”,在计数信号量中就是信号量减一,在二值信号量中就是信号量翻转,与此同时应该设置没有信号量时该怎么办,即等待时间time,可以设置为一个固定值,不等待(为零或者不填最后一项rt_err_t rt_sem_take (test_sem);)或者永久等待(RT_WAITING_FOREVER)
rt_sem_release(test_sem);
释放信号量“还回书本”,在信号量使用完以后记得还回信号量,防止后续无法使用。信号量就像“一个仅有有限本书的图书馆”。
rt_sem_detach(test_sem);
删除信号量“出售书本”,对于以后·不在使用的信号量,我们采用删除的方法来节省内存。删除信号量
rt_sem_delete(test_sem);