本帖最后由 gjianw217 于 2015-10-25 15:41 编辑
在本帖子中,主要分析一下庆科MiCO RTOS的信号量,具体包括:
OS信号量
MiCO 信号量关键API
MiCO信号量示例
MiCO信号量测试结果
一、OS信号量
在常见的OS系统中,信号量常用在多线程多任务同步中,即主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)所拥有。信号量的值为正的时候,说明它空闲。所测试的线程可以锁定而使用它。若为0,说明它被占用,测试的线程要进入睡眠队列中,等待被唤醒。在linux系统中,信号量的常见用法是将要保护的变量放在sem_wait和sem_post中间所形成的临界区内,这样该变量就会被保护起来。
二、MiCO 信号量关键API
在MiCO中,对于信号量的定义,位于SDK_MiCOKit_v2.3.0.2includemico_rtos.h中,主要有以下函数:
其中,常用的有:
(1)OSStatus mico_rtos_init_semaphore(mico_semaphore_t* semaphore, int count );
该函数为初始化一个信号量,并提供一个基数,参数1为指向要初始化的信号量句柄的指针(typedef void* mico_semaphore_t;);参数2为该信号量的最大计数值
(2)OSStatus mico_rtos_set_semaphore(mico_semaphore_t* semaphore );
该函数为设置(增加,发出)信号量,参数为指向要设置的信号量句柄的指针
(3)OSStatus mico_rtos_get_semaphore(mico_semaphore_t* semaphore, uint32_t
timeout_ms );
该函数为获取(减少,接收)信号量,并提供超时机制,参数1为指向要获取的信号量句柄的指针,参数2为返回前等待的毫秒数
三、MiCO信号量示例
该示例参数官方的测试demo,参考示例代码位于SDK_MiCOKit_v2.3.0.2DemosCOM.MXCHIP.BASICos,官网示例代码说明http://mico.io/wiki/doku.php?id=basic_os。
首先,定义了一个全局变量和两个信号量
然后,分别定义了两个线程回调函数,一个使全局变量递增,一个使全局变量递减;
最后,在测试函数中,初始化信号量,并创建两个线程,分别执行定义的回调函数。
- static mico_semaphore_t os_sem = NULL;
- void release_thread(void *arg)
- {
- UNUSED_PARAMETER( arg );
- while(1){
- mico_os_log( "release semaphore" );
- mico_rtos_set_semaphore( &os_sem );
- mico_thread_sleep( 3 );
- }
-
- //mico_rtos_delete_thread(NULL);
- }
- void TestMiCOSem(void)
- {
- OSStatus err = kNoErr;
- mico_os_log( "test binary semaphore" );
- err = mico_rtos_init_semaphore( &os_sem, 1 );//0/1 binary semaphore || 0/N semaphore
- require_noerr( err, exit );
- err = mico_rtos_create_thread( NULL, MICO_APPLICATION_PRIORITY, "release sem", release_thread, 500, NULL );
- require_noerr( err, exit );
- while(1){
- mico_rtos_get_semaphore( &os_sem, MICO_WAIT_FOREVER );//wait until get semaphore
- mico_os_log( "get semaphore" );
- }
- exit:
- if( err != kNoErr )
- mico_os_log( "Thread exit with err: %d", err );
- if( os_sem != NULL )
- mico_rtos_deinit_semaphore( &os_sem );
- mico_rtos_delete_thread( NULL );
- return ;
- }
四、MiCO信号量测试结果