女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

TThread完整版學習(RCEA考試練習)之信號量使用

冬至配餃子 ? 來源:笨狗學電子 ? 作者:一只技術狗 ? 2023-07-26 16:43 ? 次閱讀

信號量是線程間同步的一種方式。在rtthread中用于線程間同步的還有互斥量和事件集。

什么是進程間同步,簡單點的類比就是工廠中的生產線,如果想要執行B工序就必須等待A工序的完成,那么工序A和工序B就是同步的關系,在程序中也是一樣。只不過是工序變成了線程。在RTThread的文檔里有這樣的描述:同步是指按預定的先后次序進行運行,線程同步是指多個線程通過特定的機制(如互斥量,事件對象,臨界區)來控制線程之間的執行順序,也可以說是在線程之間通過同步建立起執行順序的關系,如果沒有同步,那線程之間將是無序的。

然后就是解釋一下信號量,一個經典的解釋

以生活中的停車場為例來理解信號量的概念:

①當停車場空的時候,停車場的管理員發現有很多空車位,此時會讓外面的車陸續進入停車場獲得停車位;

②當停車場的車位滿的時候,管理員發現已經沒有空車位,將禁止外面的車進入停車場,車輛在外排隊等候;

③當停車場內有車離開時,管理員發現有空的車位讓出,允許外面的車進入停車場;待空車位填滿后,又禁止外部車輛進入。

在此例子中,管理員就相當于信號量,管理員手中空車位的個數就是信號量的值(非負數,動態變化);停車位相當于公共資源(臨界區),車輛相當于線程。車輛通過獲得管理員的允許取得停車位,就類似于線程通過獲得信號量訪問公共資源。

最后信號量的使用。其實如果不追究內核的話,操作系統只需要調用api就可以了。具體就是創建信號量(rt_sem_create)、刪除信號量(rt_sem_delete)獲取信號量( rt_sem_take)、釋放信號量( rt_sem_release)詳細使用手冊可以參考這里

接下來就是一個實驗,使用信號量控制LED以500ms的間隔閃爍。

思路:使用一個定時器:每500毫秒釋放一次信號量,在創建一個線程用來反轉LED燈,當有信號量的時候就執行反轉LED燈。

程序部分

/* defined the LED0 pin: PB1 */
#define LED0_PIN    GET_PIN(H, 11)


//定義信號量
static rt_sem_t led_sem = RT_NULL; 
//定義線程
static char led_stack[512];
static struct rt_thread led_thread;
//定時器定義
static rt_timer_t timer_res;

void task_init(void); //線程初始化函數
static void led_entry(void *parameter);//LED反轉線程
static void timer(void *parameter);//定時器任務


int main(void)
{
    /* set LED0 pin mode to output */
    rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);
  task_init();
    while (1)
    {
        rt_thread_mdelay(1000);
    }


}


void task_init(void)
{


  /* 創建一個動態信號量,初始值是 0,先進先出*/
    led_sem = rt_sem_create("led on sem", 0, RT_IPC_FLAG_FIFO);
    if (led_sem == RT_NULL)
    {
        rt_kprintf("create led on semaphore failed.n");
        return ;
    }
  //靜態創建任務
  rt_thread_init(&led_thread, //線程句柄 
                   "led on", //線程的描述
                   led_entry, //線程入口函數
                   RT_NULL, //線程入口參數
                   &led_stack[0],//線程的棧的起始地址
                   sizeof(led_stack),//線程的棧大小
                   3, 10);//線程的優先級和時間片大小
    rt_thread_startup(&led_thread);//啟動線程

  timer_res = rt_timer_create("led sem",//定時器描述
                     timer,//定時器入口函數
                     RT_NULL,//定時器入口參數
                     500,//定時時間
                     RT_TIMER_FLAG_PERIODIC);//循環  
  if(timer_res != RT_NULL)
  {
    rt_timer_start(timer_res);//定時器開始
    rt_kprintf("timer start. n");
  }
}


static void timer(void *parameter)
{
  rt_sem_release(led_sem);//釋放信號量
}




static void led_entry(void *parameter)
{
  while(1)
  {
    /*以永遠阻塞的形式等待信號量*/
    if(rt_sem_take (led_sem, RT_WAITING_FOREVER) == RT_EOK)
    {
      HAL_GPIO_TogglePin(GPIOH, GPIO_PIN_11);//反轉LED
      rt_kprintf("led toggle.tick:%d n",rt_tick_get());
    }
  }
}

下面就是運行結果

圖片

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • led燈
    +關注

    關注

    22

    文章

    1593

    瀏覽量

    109307
  • 定時器
    +關注

    關注

    23

    文章

    3284

    瀏覽量

    117072
  • GPIO
    +關注

    關注

    16

    文章

    1261

    瀏覽量

    53490
  • 信號量
    +關注

    關注

    0

    文章

    53

    瀏覽量

    8497
  • RTThread
    +關注

    關注

    8

    文章

    132

    瀏覽量

    41510
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    RTThread操作系統移植

    RTThread完整版學習(RCEA考試練習)操作系統移植(照貓畫虎版)RTThread的一大特色就是有豐富免費的組件可以用,但是對于我這
    發表于 08-03 06:42

    《VHDL實用教程》完整版

    電子發燒友網站提供《《VHDL實用教程》完整版.txt》資料免費下載
    發表于 09-21 14:30 ?0次下載

    《VHDL實用教程》完整版

    電子發燒友網站提供《《VHDL實用教程》完整版.txt》資料免費下載
    發表于 08-28 16:30 ?0次下載

    AltiumDesignerSummer9完整版安裝

    AltiumDesignerSummer9完整版安裝
    發表于 12-08 21:37 ?0次下載

    ASCLL碼表(完整版)

    ASCLL碼表(完整版)ASCLL碼表(完整版)ASCLL碼表(完整版)ASCLL碼表(完整版)
    發表于 11-20 11:26 ?0次下載

    ASCII碼表完整版

    ASCII碼表完整版,方便學習C語言或者做LCD顯示器時用到。
    發表于 12-22 10:44 ?0次下載

    STM32固件庫_中文版_最完整版

    STM32固件庫_中文版_最完整版,看好了是最完整版
    發表于 05-16 11:05 ?0次下載

    C_基本語法詳解大全完整版

    電子專業單片機相關知識學習教材資料——C_基本語法詳解大全完整版
    發表于 07-25 09:49 ?0次下載

    ASCII碼表(完整版)

    ASCII碼表(完整版),感興趣的小伙伴可以看看。
    發表于 07-29 14:15 ?0次下載

    Linux命令大全完整版

    Linux命令大全完整版
    發表于 12-16 22:33 ?0次下載

    EN55032(2012)AC(2013)英文完整版

    EN55032,輻射騷擾新標準,RE/CE。英文完整版。大家一起學習
    發表于 07-20 09:04 ?0次下載

    C51學習的教程完整版

    C51學習的教程完整版
    發表于 10-16 10:52 ?0次下載
    C51<b class='flag-5'>學習</b>的教程<b class='flag-5'>完整版</b>

    C語言程序設計上機考試練習題和答案免費下載

    本文檔的主要內容詳細介紹的是C語言程序設計上機考試練習題和答案免費下載
    發表于 10-28 08:00 ?15次下載

    常見電子元器件完整版

    電子元器件完整版
    發表于 06-21 14:54 ?0次下載

    SD卡協議學習點滴(完整版本)

    電子發燒友網站提供《SD卡協議學習點滴(完整版本).pdf》資料免費下載
    發表于 10-13 09:31 ?2次下載
    SD卡協議<b class='flag-5'>學習</b>點滴(<b class='flag-5'>完整版</b>本)