<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 牛人業(yè)話(huà) > 任務(wù)堆棧不是系統堆棧 搞混了就會(huì )完蛋

任務(wù)堆棧不是系統堆棧 搞混了就會(huì )完蛋

作者:三昧道人 時(shí)間:2019-04-24 來(lái)源:電子產(chǎn)品世界 收藏

但是,代碼可不像大妹子那么好看。一眼望去,好幾個(gè).c文件中密密麻麻的字符,簡(jiǎn)直是老鼠拉烏龜,沒(méi)有下手的地方呀!

本文引用地址:http://dyxdggzs.com/article/201904/399825.htm

1556075978925524.jpg

有些人總是有著(zhù)鷹一般銳利的眼睛,比如他們會(huì )發(fā)現,新版倚天屠龍記中張無(wú)忌和趙敏居然足足吻了25秒鐘,而且張無(wú)忌一邊吻還一邊貪婪地咽口水。好吧,我承認,我也發(fā)現了張無(wú)忌咽口水的猥瑣模樣,但是對于枯燥的代碼,我實(shí)在沒(méi)有這般銳利的眼睛,只好一行代碼一行代碼地硬著(zhù)頭皮看。

I2C部分自然是不用看的。只看上層驅動(dòng)就可以了,很快,我把目光放在了函數atsha204_mac身上,這正是我最終調用的那個(gè)函數。

這個(gè)函數實(shí)在也太顯眼了,因為這個(gè)函數不僅調用了好幾個(gè)函數,里面還有三個(gè)大數組形式的局部變量:

uint8_t transmit_buffer[SHA204_CMD_SIZE_MAX];

uint8_t response_buffer[SHA204_RSP_SIZE_MAX];

uint8_t soft_digest[32];

單單是這三個(gè)局部變量就足足用掉了151個(gè)字節!再加上其他局部變量,快到200字節了,要知道,在調用這個(gè)函數時(shí),它里面的所有局部變量都是要放到堆棧上的,這樣的話(huà),才可能會(huì )在中斷發(fā)生時(shí)保存現場(chǎng),以在中斷服務(wù)程序完成后再度恢復現場(chǎng)。

現場(chǎng)當然不止包括局部變量,還要再加上調用的子函數,這樣算下來(lái),atsha204_mac這個(gè)函數運行時(shí)消耗掉的堆棧還不得快到300字節了?齊工調用這個(gè)函數的主程序是裸機形式,消耗的是,的默認配置是512字節,可是我是在帶有操作系統的任務(wù)里面調用這個(gè)函數的,消耗的是,我對的默認配置是256字節??!

問(wèn)題一目了然了,我輕輕地揮了揮手,把齊工提溜了過(guò)來(lái),

or

和齊工說(shuō)完問(wèn)題的原因之后,我心情大好,問(wèn)起了齊工:“你知道不知道你的主程序設置的堆??臻g有多大?”根據我對齊工的了解,一心撲在炒股上面的他,應該不知道在哪里設置堆??臻g,更遑論堆??臻g有多大了。

果然,他瞪著(zhù)無(wú)辜的小眼神掃了我一眼,嘴角彎出一抹笑意,等著(zhù)我的科普。

1556076019727872.jpg

我滿(mǎn)意地看著(zhù)他的表情,鼓起腮幫子說(shuō)了起來(lái),“在prm文件里面,你看一下這個(gè)設置STACKSIZE 0x200,512個(gè)字節。你驗證加密認證模塊時(shí),用的就是這個(gè)堆棧,你可以看一下MCU初始化時(shí)對SP寄存器的設置和堆棧區域的初始化,SP寄存器設置堆棧棧頂,初始化程序里,從棧頂開(kāi)始,根據STACKSIZE把用作堆棧的那部分RAM初始化為0?!?/p>

“哦,那按你的意思,如果Atmel的那個(gè)函數在裸機里面運行,消耗的就是系統堆棧,但是這個(gè)函數一旦在你的任務(wù)里面運行,消耗的就是任務(wù)堆棧了,為什么呢?”齊工精靈剔透,一下子就提問(wèn)到了問(wèn)題的本質(zhì)。

‘孺子可教也!’我一邊在心里嘀咕著(zhù),一邊組織著(zhù)語(yǔ)言,回答他的問(wèn)題。

“你來(lái)看一下在我用的這個(gè)ucos操作系統里,任務(wù)切換時(shí)到底執行了什么就清楚了?!蔽乙贿厔澙?zhù)鼠標轉輪,一邊在屏幕上找著(zhù)對SP指針進(jìn)行操作的地方。嗯?那雙發(fā)現張無(wú)忌咽口水的鷹一般銳利的眼睛哪里去了?找了半天后,我突然意識到,應該翻到匯編代碼里面去找,于是我翻到os_cpu_a.s文件里面,終于找到了下面這條語(yǔ)句:

lds 0,x ;  3~, Load the SP of the next task

這是任務(wù)切換時(shí)將SP寄存器設置為待切換任務(wù)結構體中的堆棧指針內容的地方,它和裸機形式里只初始化一次SP的方式不一樣,每次切換到新的任務(wù)時(shí)都要設置一次,所以如果任務(wù)堆棧設計地過(guò)小,就無(wú)法運行atsha204_mac這個(gè)消耗大量堆棧的函數。

“那怎么解決呢?”齊工怯怯地問(wèn),顯然,他不想改這個(gè)函數的實(shí)現方式。

從臉盲癥中恢復的我定定地看了一下齊工,想到他上次給我推薦了一只好股票的“恩惠”,大手一揮,朗然道:“你不用管了,我可以在創(chuàng )建任務(wù)之前調用這個(gè)函數,這時(shí)它用的還是系統堆棧。也可以在任務(wù)中調用它,把調用位置所在的任務(wù)堆棧加大也可以?!?/p>

看到他漸漸輕松了的笑容,我又加上了一句科普:任務(wù)堆棧不是系統堆棧,搞混了就會(huì )完蛋??!


上一頁(yè) 1 2 下一頁(yè)

關(guān)鍵詞: 任務(wù)堆棧 系統堆棧

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>