RTX5 | 内存池03 - 共享内存用于线程之间的通讯(轮询方式)
文章目錄
- 一、前言
- 怎樣防止內(nèi)存溢出?
- 二、實驗?zāi)康?/li>
- 三、代碼
- 3.1、main.h
- 3.2、main.c
- 四、Debug
- 4.1、Debug (printf) Viewer
- 4.2、修改一下程序:線程B不從ringbuffer讀取數(shù)據(jù),線程A不斷往ringbuffer寫入數(shù)據(jù)
一、前言
正如官方介紹所說,共享內(nèi)存是線程與線程(或ISR)之間通訊的一種基本的模型。而且,當(dāng)線程與線程之間的通訊使用共享內(nèi)存時,相比消息隊列有更高的通訊效率,更復(fù)雜的通訊結(jié)構(gòu)。
有了共享內(nèi)存之后,并不是說消息隊列毫無用處之地了。消息隊列使用起來簡單,并提供阻塞線程的功能。實際工作上,如果不講究效率的話,盡量用消息隊列吧,它即簡單又強(qiáng)大又安全。
雖然,內(nèi)存池解決了線程安全與內(nèi)存碎片化的問題,但是并沒有解決內(nèi)存溢出的問題。在《嵌入式實時操作系統(tǒng) uc/OS-III 》第17章-存儲管理有講到。
怎樣防止內(nèi)存溢出?
為了解決內(nèi)存溢出問題,需要使用另外一個強(qiáng)大的數(shù)據(jù)結(jié)構(gòu)與算法-ringbuffer算法。我認(rèn)為學(xué)習(xí)嵌入式軟件設(shè)計,必須學(xué)會如何使用ringbuffer算法。在實際工作中,我到處都用了ringbuffer算法。
ringbuffer算法的介紹可以看博主Mculover666的博文《ringbuffer | 通用FIFO環(huán)形緩沖區(qū)實現(xiàn)庫》 :
其實,上面的ringbuffer算法比較完整且復(fù)雜。我一直使用正點原子項目上精簡版的ringbuffer算法,暫時沒有發(fā)現(xiàn)任何問題,大家可以從工程里下載。
STM32工程:
鏈接:https://pan.baidu.com/s/149P8nuSoXNWenEc479iYIQ
提取碼:1hj5
二、實驗?zāi)康?/h1>
創(chuàng)建一個內(nèi)存池,作為線程A與線程B通訊使用的共享內(nèi)存,線程A每隔1s往共享內(nèi)存里寫入數(shù)據(jù),線程B每隔300ms輪詢一次共享內(nèi)存是否有新數(shù)據(jù)。
三、代碼
3.1、main.h
3.2、main.c
四、Debug
4.1、Debug (printf) Viewer
4.2、修改一下程序:線程B不從ringbuffer讀取數(shù)據(jù),線程A不斷往ringbuffer寫入數(shù)據(jù)
線程A的不斷寫入,且線程B沒有讀取數(shù)據(jù),會不會引起內(nèi)存溢出??首先將線程B的部分代碼備注掉,備注掉這些代碼,線程B實際沒有什么事情干。
創(chuàng)建ringbuffer的時候,已經(jīng)往ringbuffer寫入一個數(shù)據(jù),所以接下來只能寫入7個數(shù)據(jù)。
此時,觀察一下ringbuffer對象的數(shù)據(jù)看看。
寫入數(shù)據(jù)的指針在0x0007的位置(這段共享內(nèi)存的大小是8,從0x0000開始,實際上0x00007就是第八個位置了。)
在寫入數(shù)據(jù)方面,ringbuffer算法提供了內(nèi)存滿了的提示,防止寫入數(shù)據(jù)引起內(nèi)存溢出。在讀取數(shù)據(jù)方面,ringbuffer算法提供了沒有信息可以讀取的提示,防止讀取數(shù)據(jù)引起內(nèi)存溢出。
總結(jié)
以上是生活随笔為你收集整理的RTX5 | 内存池03 - 共享内存用于线程之间的通讯(轮询方式)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux档案权限655,Linux学习
- 下一篇: STM32H743+CubeMX-串口非