庆科社区
直播中

gjianw217

10年用户 687经验值
擅长:嵌入式技术 控制/MCU RF/无线
私信 关注

【MiCOKit试用体验】庆科MiCO系统篇(2)MiCO RTOS信号量

本帖最后由 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.png
其中,常用的有:
(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
首先,定义了一个全局变量和两个信号量
然后,分别定义了两个线程回调函数,一个使全局变量递增,一个使全局变量递减;
最后,在测试函数中,初始化信号量,并创建两个线程,分别执行定义的回调函数。
  1. static mico_semaphore_t os_sem = NULL;

  2. void release_thread(void *arg)
  3. {
  4.   UNUSED_PARAMETER( arg );

  5.   while(1){
  6.     mico_os_log( "release semaphore" );
  7.     mico_rtos_set_semaphore( &os_sem );
  8.     mico_thread_sleep( 3 );
  9.   }
  10.   
  11.   //mico_rtos_delete_thread(NULL);
  12. }

  13. void TestMiCOSem(void)
  14. {
  15.   OSStatus err = kNoErr;
  16.   mico_os_log( "test binary semaphore" );

  17.   err = mico_rtos_init_semaphore( &os_sem, 1 );//0/1 binary semaphore || 0/N semaphore
  18.   require_noerr( err, exit );

  19.   err = mico_rtos_create_thread( NULL, MICO_APPLICATION_PRIORITY, "release sem", release_thread, 500, NULL );
  20.   require_noerr( err, exit );

  21.   while(1){
  22.     mico_rtos_get_semaphore( &os_sem, MICO_WAIT_FOREVER );//wait until get semaphore
  23.     mico_os_log( "get semaphore" );  
  24.   }

  25. exit:
  26.   if( err != kNoErr )
  27.     mico_os_log( "Thread exit with err: %d", err );

  28.   if( os_sem != NULL )
  29.     mico_rtos_deinit_semaphore( &os_sem );

  30.   mico_rtos_delete_thread( NULL );
  31.   return ;
  32. }

四、MiCO信号量测试结果
QQ截图20151025023126.png

更多回帖

发帖
×
20
完善资料,
赚取积分