互斥量就是二元信號量励堡,因此在一章里面介紹神郊。
這一章比較簡單,廢話不多說套利,直接進(jìn)入正題
信號量可以控制任務(wù)的執(zhí)行順序奴璃,在任務(wù)同步中作用很大悉默。
信號量只有三個(gè)函數(shù),實(shí)現(xiàn)方式是利用了掛起列表pendList
信號量SemCB結(jié)構(gòu)體中的num代表信號量的值苟穆,互斥量中的num是一個(gè)bool量抄课,因?yàn)閟tm32中不支持bool關(guān)鍵字,因此bool要我們自己定義雳旅,typedef enum{false=0,true=1} bool;
首先進(jìn)行信號量的創(chuàng)建跟磨,初始化信號量,同時(shí)進(jìn)行pendList的初始化攒盈。
針對信號量主要有兩種操作抵拘,分別是p(減少num)和v(增加num)兩種操作,對應(yīng)的分別是WaitSem()和PostSem()
WaitSen減少num值型豁,如果num為負(fù)值僵蛛,就意味著有幾個(gè)線程還在等待信號量。當(dāng)信號量小于等于0是迎变,要把當(dāng)前線程從就緒表中刪除充尉,并且加入到等待列表中。然后執(zhí)行任務(wù)的切換
一旦執(zhí)行PostSem函數(shù)衣形,如果num值小于0驼侠,就意味著應(yīng)該把一個(gè)處于掛起態(tài)的函數(shù)從掛起態(tài)釋放出來加入到就緒態(tài)中。
為了驗(yàn)證程序是否正確,設(shè)計(jì)了兩個(gè)小程序倒源。
第一個(gè)是在兩個(gè)LED實(shí)驗(yàn)中分別加入semwait和sempost苛预,觀察程序是否能夠持續(xù)運(yùn)行
第二個(gè)實(shí)驗(yàn)加入了兩個(gè)按鍵中斷進(jìn)行測試,一個(gè)按鍵中斷發(fā)出waitsem相速,另一個(gè)發(fā)出postsem碟渺,觀察當(dāng)按鍵時(shí)led任務(wù)是否會阻塞。發(fā)現(xiàn)會阻塞
程序鏈接如下突诬,實(shí)驗(yàn)用的是STM32F407的開發(fā)板
鏈接:https://pan.baidu.com/s/1my2HPG6shXB7QiwbR47Dnw
提取碼:j5hw