从零开始,学习基于RTthread的嵌入式系统。

手把手建立信号量管理硬件资源

        线程的是实现项目的功能,那么我们在处理功能时总不可能让一个任务一直占用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);

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值