视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
[RTT例程练习]2.2信号量之基本使用(动态/静态信号量)
2020-11-09 08:03:43 责编:小采
文档

信号量的解释: 来自百度百科: 信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用。在进入一个关键代码段之前,线程必须获取一个信号量;一旦该关键代码段完成了,那么该线程必须释放

信号量的解释:

来自百度百科:

信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用。在进入一个关键代码段之前,线程必须获取一个信号量;一旦该关键代码段完成了,那么该线程必须释放信号量。

RT-Thread 的信号量有静态和动态,这里同线程的静态和动态是一个意思。对信号量有两种操作,take 和 release。

程序中,首先初始化信号量为0,这时首先使用take,并只等待10个tick,故一定会超时,因为信号量初始值为0,take不到。然后release一次,信号量便增加1,这时再次take,并且使用的是wait forever 的方式,便一定能得到信号量。

程序:

#include 

static struct rt_semaphore static_sem;

static rt_sem_t dynamic_sem = RT_NULL;

static rt_uint8_t thread1_stack[1024];
struct rt_thread thread1;
static void rt_thread_entry1(void *parameter)
{
 rt_err_t result;
 rt_tick_t tick;

 /* static semaphore demo */
 tick = rt_tick_get();

 /* try to take the sem, wait 10 ticks */
 result = rt_sem_take(&static_sem, 10);

 if (result == -RT_ETIMEOUT)
 {
 if (rt_tick_get() - tick != 10)
 {
 rt_sem_detach(&static_sem);
 return ;
 }
 rt_kprintf("take semaphore timeout\n");
 } 
 else 
 {
 rt_kprintf("take a static semaphore, failed.\n");
 rt_sem_detach(&static_sem);
 return ;
 } 

 /* release the semaphore */ 
 rt_sem_release(&static_sem); 
 /* wait the semaphore forever */
 result = rt_sem_take(&static_sem, RT_WAITING_FOREVER);

 if (result != RT_EOK)
 {
 rt_kprintf("take a static semaphore, failed.\n");
 rt_sem_detach(&static_sem);
 return ;
 }

 rt_kprintf("take a static semaphore, done.\n");
 /* detach the semaphore object */
 rt_sem_detach(&static_sem);
//}

/* dynamic thread pointer */
//static void thread2_entry(void *parameter)
//{
// rt_err_t result;
// rt_tick_t tick;

 tick = rt_tick_get();

 /* try to take the semaphore, wait for 10 ticks */
 result = rt_sem_take(dynamic_sem, 10);
 if (result == -RT_ETIMEOUT)
 {
 if (rt_tick_get() - tick != 10)
 {
 rt_sem_delete(dynamic_sem);
 return ;
 } 
 rt_kprintf("take semaphore timeout\n");
 }
 else
 {
 rt_kprintf("take a dynamic semaphore, failed.\n");
 rt_sem_delete(dynamic_sem);
 return ;
 }

 /* release the dynamic semaphore */
 rt_sem_release(dynamic_sem);
 /* wait forever */
 result = rt_sem_take(dynamic_sem, RT_WAITING_FOREVER);

 if (result != RT_EOK)
 {
 rt_kprintf("take a dynamic semaphore, failed.\n");
 rt_sem_delete(dynamic_sem);
 return ;
 }

 rt_kprintf("take a dynamic semaphore, done.\n");
 /* delete the semaphore*/
 rt_sem_delete(dynamic_sem);
}
//static rt_thread_t tid = RT_NULL;
int rt_application_init()
{
 rt_err_t result;

 result = rt_sem_init(&static_sem,
 "ssem",
 0, RT_IPC_FLAG_FIFO);
 if (result != RT_EOK)
 {
 rt_kprintf("init static semaphore failed. \n");
 return -1;
 }

 dynamic_sem = rt_sem_create("dsem",
 0, RT_IPC_FLAG_FIFO);
 if (dynamic_sem == RT_NULL)
 {
 rt_kprintf("create dynamic semaphore failed. \n");
 return -1;
 }

 /* thread1 init */
 rt_thread_init(&thread1, 
 "t1", 
 rt_thread_entry1, RT_NULL,
 &thread1_stack[0], sizeof(thread1_stack),
 11, 5
 );
 rt_thread_startup(&thread1);

 return 0;
}

结果为:
take semaphore timeout
take a staic semaphore, done.
take semaphore timeout
take a dynamic semaphore, done.

下载本文
显示全文
专题