你是否也被蒙在鼓里?暫停線程遠不止是一條語句的事兒!
1.介紹
本以為暫停線程是一條語句的事,結(jié)果發(fā)現(xiàn)事情并沒有那么簡單,而且我相信很多人都用錯了,就是因為踩了這么一個坑,所以準備發(fā)這么一個帖子,讓后面的人少踩坑。
2.應(yīng)用場景
有三個線程,分別為A、B和C,把A線程比作是大腦,B和C線程分別是掃地和洗碗,首先處于空閑狀態(tài),大腦讓我去掃地,這時A線程中會開啟B線程,第一次開啟線程可以調(diào)用【rt_thread_startup】這個函數(shù),沒啥毛病,當老婆大人讓我去洗碗,大腦瞬間做出反應(yīng)去洗碗,這時A線程會關(guān)閉B線程然后打開C線程,那么A線程關(guān)閉B線程是調(diào)用【rt_thread_suspend】這個函數(shù)嗎?看著沒啥問題哦,但是里面存在很大的問題!這里先不說,繼續(xù)往下走,當洗完碗還得繼續(xù)掃地,讓A線程恢復(fù)B線程需要調(diào)用【rt_thread_resume】這個函數(shù)。
上面這個應(yīng)用場景就實現(xiàn)了,A線程暫停和恢復(fù)B線程,看著是沒什么問題,我們先來實際操作一下,看看有什么問題!
3.場景再現(xiàn)
硬件:STM32F407VET6RTThread版本:3.1.3Nano首先按照上面的應(yīng)用場景走一遍,設(shè)計三個線程,分別為A、B和C,然后開始運行,具體代碼如下:
#include
ALIGN(RT_ALIGN_SIZE)
static rt_uint8_t a_thread_stack[ 512 ];
ALIGN(RT_ALIGN_SIZE)
static rt_uint8_t b_thread_stack[ 512 ];
ALIGN(RT_ALIGN_SIZE)
static rt_uint8_t c_thread_stack[ 512 ];
static struct rt_thread a_thread;
static struct rt_thread b_thread;
static struct rt_thread c_thread;
static void a_thread_entry(void *parameter)
{
unsigned int count = 0;
while (1)
{
count ;
if(count == 10)
{
rt_kprintf("b start!\n");
rt_thread_startup(