單片機 基于rt-thread 系統 使用 CCM內存

一、開發環境

開發板:野火stm32f407
系統:rt-thread V4.1.1

二、鏈接腳本配置

; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************LR_IROM1 0x08000000 0x00100000  {    ; load region size_regionER_IROM1 0x08000000 0x00100000  {  ; load address = execution address*.o (RESET, +First)*(InRoot$$Sections).ANY (+RO)}RW_IRAM1 0x20000000 0x00020000  {  ; RW data.ANY (+RW +ZI)}RW_IRAM2 0x10000000 0x00010000  {  ; RW data*(.CCM_RAM)}
}

具體配置可參考文章鏈接

https://mp.weixin.qq.com/s/s_CHsM7ykF6-n2dVwfaGUQ

三、測試代碼

使用單片機的CCNM內存創建變量和線程,打印變量和線程的地址信息,使用指令查看主RAM的信息。直接貼測試代碼,如下:

/** Copyright (c) 2006-2021, RT-Thread Development Team** SPDX-License-Identifier: Apache-2.0** Change Logs:* Date           Author       Notes* 2018-11-06     SummerGift   first version* 2018-11-19     flybreak     add stm32f407-atk-explorer bsp*/#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>/* defined the LED0 pin: PF7 */
#define LED0_PIN    GET_PIN(F, 7)/* 定義在CCM RAM里面的變量 */ 
//__attribute__((section (".CCM_RAM"))) uint32_t BufInfo[10];
//__attribute__((section (".CCM_RAM"))) uint16_t Count=5;//可以定義初值uint32_t BufInfo[10] __attribute__((section (".CCM_RAM")));uint16_t Count __attribute__((section (".CCM_RAM"))) =5;//可以這樣定義初值uint16_t CNT __attribute__((section(".CCM_RAM"), used));//使用 __attribute__((used)) 確保變量不被優化掉
__attribute__((section (".CCM_RAM"),used)) uint16_t NUM=5;//使用 __attribute__((used)) 確保變量不被優化掉/* 定義在CCM RAM里面的線程 */ 
#if defined(RT_VERSION_CHECK) && (RTTHREAD_VERSION >= RT_VERSION_CHECK(5, 0, 1))rt_align(RT_ALIGN_SIZE)
#elseALIGN(RT_ALIGN_SIZE)
#endif
//__attribute__((section (".CCM_RAM"))) static char thread1_stack[1024*60];
//__attribute__((section (".CCM_RAM"))) static struct rt_thread thread1;static char thread1_stack[1024*2] __attribute__((section (".CCM_RAM")));static struct rt_thread thread1 __attribute__((section (".CCM_RAM")));#if defined(RT_VERSION_CHECK) && (RTTHREAD_VERSION >= RT_VERSION_CHECK(5, 0, 1))rt_align(RT_ALIGN_SIZE)
#elseALIGN(RT_ALIGN_SIZE)
#endifstatic char thread2_stack[1024*2] __attribute__((section (".CCM_RAM")));static struct rt_thread thread2 __attribute__((section (".CCM_RAM")));/* 定義在CCM RAM里面的信號量 */ 
__attribute__((section (".CCM_RAM"))) static struct rt_semaphore test_sem;/* 線程 1 入口 */
static void thread1_entry(void *param)
{rt_uint32_t count = 0;rt_kprintf("count_addr= %x\r\n",&count);rt_uint32_t buf[10];for(int i=0;i<10;i++){rt_kprintf("buf[%d]_addr= %x\r\n",i,&buf[i]);}/* 線程 1 擁有較高的優先級,以搶占線程 1 而獲得執行 */static rt_err_t result;for (;;){/* 永久方式等待信號量,獲取到信號量,則執行 number 自加的操作 */result = rt_sem_take(&test_sem, RT_WAITING_FOREVER);if ( result == RT_EOK){/* 線程 1 打印計數值 */rt_kprintf("thread1 count: %d\n", count++);}else{rt_kprintf("thread 1 result is %d\n", result);}}/* 線程 1 運行結束后也將自動被系統脫離 */}/* 線程 2 入口 */
static void thread2_entry(void *param)
{rt_uint32_t count = 0;rt_kprintf("count_addr2= %x\r\n",&count);rt_uint32_t buf[10];for(int i=0;i<10;i++){rt_kprintf("buf[%d]_addr2= %x\r\n",i,&buf[i]);}for (;;){/* 線程 1 打印計數值 */rt_kprintf(" release test_sem.\n");rt_sem_release(&test_sem);rt_thread_mdelay(10000);}/* 線程 1 運行結束后也將自動被系統脫離 */}int main(void)
{/* set LED0 pin mode to output */rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);Count++;for(int i=0;i<10;i++){rt_kprintf("BufInfo[%d]_addr= %x\r\n",i,&BufInfo[i]);}BufInfo[0] = Count;rt_kprintf("CCMBuf1_addr= %x, BufInfo[0] = %d\r\n",BufInfo,BufInfo[0]);rt_kprintf("CCMCount_addr= %x, Count = %d\r\n",&Count,Count);   rt_kprintf("CNT= %x, CNT = %d\r\n",&CNT,CNT);  rt_kprintf("NUM= %x, NUM = %d\r\n",&NUM,NUM);  rt_thread_mdelay(5000);  rt_kprintf("intput free\r\n");  rt_thread_mdelay(10000);rt_sem_init(&test_sem, "testSem",     0,      RT_IPC_FLAG_PRIO);rt_kprintf("test_sem_addr= %x\r\n",&test_sem); rt_thread_mdelay(10000);/* 初始化線程 1,名稱是 thread1,入口是 thread1_entry */rt_thread_init(&thread1,"thread1",thread1_entry,RT_NULL,&thread1_stack[0],sizeof(thread1_stack),25, 5);rt_thread_startup(&thread1);rt_kprintf("thread1_addr= %x\r\n",&thread1);  rt_kprintf("thread1_stack_addr= %x\r\n",thread1_stack);   rt_thread_mdelay(10000);/* 初始化線程 2,名稱是 thread2,入口是 thread2_entry */rt_thread_init(&thread2,"thread2",thread2_entry,RT_NULL,&thread2_stack[0],sizeof(thread2_stack),25, 5);rt_thread_startup(&thread2);rt_kprintf("thread2_addr= %x\r\n",&thread2);  rt_kprintf("thread2_stack_addr= %x\r\n",thread2_stack);                  rt_thread_mdelay(10000);                rt_kprintf("intput free\r\n"); rt_thread_mdelay(10000);while (1){rt_pin_write(LED0_PIN, PIN_HIGH);rt_thread_mdelay(500);rt_pin_write(LED0_PIN, PIN_LOW);rt_thread_mdelay(500);}
}

測試結果:
打印變量的信息
在這里插入圖片描述

打印線程的信息
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/88088.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/88088.shtml
英文地址,請注明出處:http://en.pswp.cn/web/88088.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【UnityAssetBundle】AB包卸載資源

AB包的卸載高效穩定游戲開發的強制要求&#xff0c;它解決了資源管理中的內存泄漏問題&#xff0c;為動態的內容加載、熱更新、大型世界的構建提供了內存保障&#xff0c;最終提升了游戲性能、穩定性和用戶體驗。卸載資源方式一&#xff08;推薦使用&#xff09;&#xff1a;卸…

【萬字長文】深度學習2 yolov5修改為自己的數據集

數據預處理 使用labelme可以直接導出適用于yolo模型的txt文本數據&#xff0c;也可以直接導出默認的json數據結構&#xff0c;后面我會提供代碼進行轉換。自行進行標注&#xff0c;圖片與標注一一對應&#xff0c;更多要求不贅述。因為我做最簡單的檢索模型&#xff0c;不做切…

ubuntu18編譯RealSense SDK 2.0

參考文章&#xff1a;https://dev.intelrealsense.com/docs/compiling-librealsense-for-linux-ubuntu-guide1、安裝依賴 sudo apt-get update && sudo apt-get upgrade && sudo apt-get dist-upgrade sudo apt-get install libssl-dev libusb-1.0-0-dev libud…

算法學習筆記:9.Kruskal 算法——從原理到實戰,涵蓋 LeetCode 與考研 408 例題

在圖論的眾多算法中&#xff0c;Kruskal 算法以其簡潔高效的特性&#xff0c;成為求解最小生成樹&#xff08;Minimum Spanning Tree&#xff0c;MST&#xff09;的經典方法。無論是在通信網絡的優化設計、電路布線的成本控制&#xff0c;還是在計算機考研 408 的備考過程中&am…

Vue+Openlayers加載OSM、加載天地圖

文章目錄1. 介紹2. 加載底圖2.1 加載默認OSM地圖2.2 加載天地圖1. 介紹 Openlayers官網&#xff1a;https://openlayers.org/ 安裝依賴&#xff1a;npm i ol 2. 加載底圖 參考博客&#xff1a; vueopenlayers環境配置&#xff1a;https://blog.csdn.net/cuclife/article/det…

Python處理電子表格文件庫之pyexcel使用詳解

概要 pyexcel是一個功能強大的Python第三方庫,專門用于處理各種格式的電子表格文件。核心價值在于提供了統一的接口來讀取、寫入和操作Excel、CSV、ODS等多種電子表格格式,極大簡化了數據處理工作流程。與傳統的單一格式處理庫不同,pyexcel采用了插件化架構,使開發者能夠通…

【網絡安全】惡意 Python 包“psslib”仿冒 passlib,可導致 Windows 系統關閉

文章目錄惡意 Python 包“psslib”仿冒 passlib如何避免psslib的威脅惡意 Python 包“psslib”仿冒 passlib Socket 的威脅研究團隊發現了一個名為 psslib 的惡意 Python 包&#xff0c;旨在以提供密碼安全功能為幌子突然關閉 Windows 系統。 該軟件包由威脅行為者使用別名 u…

ai之對接電信ds后端服務,通過nginx代理轉發https為http,對外請求,保持到達第三方后請求頭不變

前置環境&#xff1a; 在微信小程序中嵌入H5頁面&#xff08;智能客服&#xff09;&#xff0c;需要讓h5頁面在https的域名服務器上。即通過 nginx 部署成web服務&#xff0c;還得配置域名和端口443訪問。電信的第三方deepseek服務 &#xff0c;只接收http請求&#xff0c;暫未…

第十四節:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入門 - Flask 后端 生產部署講解

Vben5 系列文章目錄 ?? 基礎篇 ? 第一節:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入門 ? 第二節:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入門 - Python Flask 后端開發詳解(附源碼) ? 第三節:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入…

Unity開發如何解決iOS閃退問題

一、iOS閃退常見原因及排查方法1. 內存問題&#xff08;最常見原因&#xff09; 癥狀表現&#xff1a; 設備發熱后閃退 加載大型場景時崩潰 控制臺出現EXC_RESOURCE RESOURCE_TYPE_MEMORY日志 解決方案&#xff1a; // 內存監控代碼 void Update() { Debug.Log($"內存使用…

【機器學習筆記 Ⅲ】5 強化學習

強化學習&#xff08;Reinforcement Learning, RL&#xff09; 強化學習是機器學習的一個分支&#xff0c;其核心思想是讓智能體&#xff08;Agent&#xff09;通過與環境&#xff08;Environment&#xff09;的交互學習最優策略&#xff08;Policy&#xff09;&#xff0c;以最…

pytorch深度學習-卷積神經網絡CNN-MNIST-gpu加速

一、為什么需要 CNN&#xff1f;從圖像識別的 “麻煩” 說起假設你想讓電腦識別一張圖片里有沒有貓。 如果用傳統神經網絡&#xff1a;一張 100100 的彩色圖片&#xff0c;有 100100330000 個像素點&#xff0c;每個像素點都是一個輸入神經元。傳統網絡需要每個輸入神經元和隱藏…

【阿里巴巴JAVA開發手冊】IDE的text file encoding設置為UTF-8; IDE中文件的換行符使用Unix格式,不要使用Windows格式。

問題&#xff1a;當使用 IDEA SSH 遠程開發時&#xff0c;SFTP 同步的 Windows 本地編輯的 config/plugin_config 文件文本內容中 “換行符”與 Unix、Linux 的文件文本內容換行符字符集不一致&#xff0c;導致 docker 容器中自定義 /opt/seatunnel/bin/install_plugin 在執行以…

自動駕駛ROS2應用技術詳解

自動駕駛ROS2應用技術詳解 目錄 自動駕駛ROS2節點工作流程自動駕駛感知融合技術詳解多傳感器數據同步技術詳解ROS2多節點協作與自動駕駛系統最小節點集 1. 自動駕駛ROS2節點工作流程 1.1 感知輸出Topic的后續處理 在自動駕駛系統中&#xff0c;感知節點輸出的各種Topic會被…

Redis底層實現原理之訂閱發布機制

文章目錄1. 通知類型2. 實現原理2.1 Pub/Sub2.1.1 基礎知識點2.1.2 頻道和訂閱者的存儲通知原理2.1.3 鍵空間通知2.1.4 客戶端消費2.1.5 缺陷2.2 Redis Stream2.2.1 基礎知識點2.2.2 基礎數據結構2.2.3 消費者組管理2.2.4 消息和消費者持久化2.2.5 消息生產和消費2.2.6 消費者拉…

【MATLAB代碼】AOA與TDOA混合定位例程,自適應基站數量,二維,可調節錨點數量。訂閱專欄后,可直接查看matlab源代碼

本文給出一個matlab代碼,用于在二維平面上,使用AOA的角度測量和TDOA的到達時間差的測量,來達到對未知點的精確定位。最后輸出定位示意圖、真實點坐標、僅AOA定位坐標與誤差、僅TDOA定位的坐標與誤差、AOA+TDOA混合定位的坐標與誤差。訂閱專欄后可直接查看源代碼,粘貼到MATL…

Node.js 所有主要版本的發布時間、穩定版本(Stable)和長期支持版本(LTS) 的整理

以下是 Node.js 所有主要版本的發布時間、穩定版本&#xff08;Stable&#xff09;和長期支持版本&#xff08;LTS&#xff09; 的整理&#xff0c;涵蓋從早期版本到當前最新版本的信息。 &#x1f4c5; Node.js 版本發布規律 每 6 個月發布一個新主版本&#xff08;偶數月&am…

【牛客刷題】小紅的v三元組

文章目錄 一、題目介紹1.1 題目描述1.2 輸入描述1.3 輸出描述1.4 示例二、解題思路2.1 核心算法設計2.2 性能優化關鍵2.3 算法流程圖三、算法實現四、算法分析4.1 時間復雜度4.2 空間復雜度4.3 正確性證明五、為什么選擇離散化+樹狀數組的解法?5.1 問題本質分析5.2 解法設計思…

c語言學習_函數遞歸

今天學習函數遞歸。函數遞歸通俗來說就是函數自己調用自己&#xff0c;遞歸的主要思考方式在于&#xff1a;把大事化小。例子&#xff1a;接受一個整型值&#xff0c;按照順序打印它的每一位。void print(unsigned int n) {if (n > 9){print(n / 10);}printf("%d"…

Bash與Zsh與Fish:在Linux中你應該使用哪個Shell

命令行 shell 是與操作系統交互的重要工具&#xff0c;使用戶能夠高效地執行命令、自動化任務和運行腳本。 雖然有各種外殼選項可供選擇&#xff0c;但Bash、Zsh和Fish作為最受歡迎的選擇脫穎而出&#xff0c;每種都提供獨特的功能&#xff0c;因此理解它們的差異對于選擇適合…