在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

    文章

    1595

    瀏覽量

    109371
  • 定時器
    +關注

    關注

    23

    文章

    3288

    瀏覽量

    117263
  • GPIO
    +關注

    關注

    16

    文章

    1276

    瀏覽量

    53602
  • 信號量
    +關注

    關注

    0

    文章

    53

    瀏覽量

    8505
  • RTThread
    +關注

    關注

    8

    文章

    132

    瀏覽量

    41552
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    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次下載

    《ZigBee協議規范完整版》(中)

    《ZigBee2006協議規范完整版》(中) 不收積分,需要的看下
    發表于 11-23 18:25 ?0次下載

    ASCII碼表完整版

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

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

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

    ASCII碼表(完整版)

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

    Linux命令大全完整版

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

    新版Android開發教程及筆記-完整版

    新版Android開發教程及筆記-完整版
    發表于 03-19 11:24 ?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次下載

    PCIE協議5.0完整版

    PCIE協議5.0完整版
    發表于 09-13 14:32 ?0次下載

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

    電子發燒友網站提供《SD卡協議學習點滴(完整版本).pdf》資料免費下載
    發表于 10-13 09:31 ?2次下載
    SD卡協議<b class='flag-5'>學習</b>點滴(<b class='flag-5'>完整版</b>本)
    主站蜘蛛池模板: 日韩成人毛片高清视频免费看 | 成人网久久 | 2017天天干 | 欧美日韩国产另类一区二区三区 | 91福利国产在线观看网站 | 免费视频一区二区 | 奇米9999 | 午夜在线播放视频 | 国产午夜精品理论片久久影视 | 国产精品免费拍拍拍 | 毛片大全在线 | 黄色免费网站在线观看 | 免费看美女的逼 | 99精品国产高清自在线看超 | 亚洲精品久久久久久婷婷 | 亚洲精品精品一区 | 亚洲男人的天堂久久香蕉 | 成人三级毛片 | 4虎影院永久地址www | 久久久久国产精品免费网站 | 免费美剧在线观看 | 日韩一级黄色录像 | 欧美成人免费观看bbb | 免费国产午夜在线观看 | 精品一区二区三区自拍图片区 | 日本一卡精品视频免费 | 国产高清视频免费最新在线 | 最新版天堂资源8网 | 美女被色| 大又大又粗又爽又黄毛片女人 | 女人又色又爽又黄 | 美日韩一级 | 高清人人天天夜夜曰狠狠狠狠 | 夜夜狠操 | 日本三级全黄三级a | 操操操干干 | 国产一区二区中文字幕 | 欧美日韩精品乱国产538 | 色婷婷六月丁香在线观看 | 在线精品国产三级 | 狠狠色狠狠色综合日日32 |