日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

RTX5 | 内存池03 - 共享内存用于线程之间的通讯(轮询方式)

發布時間:2025/3/15 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 RTX5 | 内存池03 - 共享内存用于线程之间的通讯(轮询方式) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 一、前言
    • 怎樣防止內存溢出?
  • 二、實驗目的
  • 三、代碼
    • 3.1、main.h
    • 3.2、main.c
  • 四、Debug
    • 4.1、Debug (printf) Viewer
    • 4.2、修改一下程序:線程B不從ringbuffer讀取數據,線程A不斷往ringbuffer寫入數據

一、前言


正如官方介紹所說,共享內存是線程與線程(或ISR)之間通訊的一種基本的模型。而且,當線程與線程之間的通訊使用共享內存時,相比消息隊列有更高的通訊效率,更復雜的通訊結構。

有了共享內存之后,并不是說消息隊列毫無用處之地了。消息隊列使用起來簡單,并提供阻塞線程的功能。實際工作上,如果不講究效率的話,盡量用消息隊列吧,它即簡單又強大又安全。

雖然,內存池解決了線程安全與內存碎片化的問題,但是并沒有解決內存溢出的問題。在《嵌入式實時操作系統 uc/OS-III 》第17章-存儲管理有講到。

怎樣防止內存溢出?

為了解決內存溢出問題,需要使用另外一個強大的數據結構與算法-ringbuffer算法。我認為學習嵌入式軟件設計,必須學會如何使用ringbuffer算法。在實際工作中,我到處都用了ringbuffer算法。

ringbuffer算法的介紹可以看博主Mculover666的博文《ringbuffer | 通用FIFO環形緩沖區實現庫》 :

其實,上面的ringbuffer算法比較完整且復雜。我一直使用正點原子項目上精簡版的ringbuffer算法,暫時沒有發現任何問題,大家可以從工程里下載。

STM32工程:
鏈接:https://pan.baidu.com/s/149P8nuSoXNWenEc479iYIQ
提取碼:1hj5

二、實驗目的


創建一個內存池,作為線程A與線程B通訊使用的共享內存,線程A每隔1s往共享內存里寫入數據,線程B每隔300ms輪詢一次共享內存是否有新數據。

三、代碼


3.1、main.h

3.2、main.c




四、Debug


4.1、Debug (printf) Viewer

4.2、修改一下程序:線程B不從ringbuffer讀取數據,線程A不斷往ringbuffer寫入數據

線程A的不斷寫入,且線程B沒有讀取數據,會不會引起內存溢出??首先將線程B的部分代碼備注掉,備注掉這些代碼,線程B實際沒有什么事情干。

創建ringbuffer的時候,已經往ringbuffer寫入一個數據,所以接下來只能寫入7個數據。

此時,觀察一下ringbuffer對象的數據看看。

寫入數據的指針在0x0007的位置(這段共享內存的大小是8,從0x0000開始,實際上0x00007就是第八個位置了。)

在寫入數據方面,ringbuffer算法提供了內存滿了的提示,防止寫入數據引起內存溢出。在讀取數據方面,ringbuffer算法提供了沒有信息可以讀取的提示,防止讀取數據引起內存溢出。

總結

以上是生活随笔為你收集整理的RTX5 | 内存池03 - 共享内存用于线程之间的通讯(轮询方式)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。