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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

STM32 之五 Core Coupled Memory(CCM)内存

發布時間:2024/10/14 编程问答 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STM32 之五 Core Coupled Memory(CCM)内存 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

寫在前面

  • 今天在搞STM32F4時,用到了一部分特殊內存——CCM。搜了搜網上沒多少介紹,索性自己查手冊。
  • 某些芯片沒有CCM

基本架構

??廢話少說,先看看這塊內存特殊在哪里。官方的基本架構說明如下:
??The main system consists of 32-bit multilayer AHB bus matrix that interconnects:

  • Eight masters:
    – Cortex? -M4 with FPU core I-bus, D-bus and S-bus
    – DMA1 memory bus
    – DMA2 memory bus
    – DMA2 peripheral bus
    – Ethernet DMA bus
    – USB OTG HS DMA bus
  • Seven slaves:
    – Internal Flash memory ICode bus
    – Internal Flash memory DCode bus
    – Main internal SRAM1 (112 KB)
    – Auxiliary internal SRAM2 (16 KB)
    – AHB1 peripherals including AHB to APB bridges and APB peripherals
    – AHB2 peripherals
    – FSMC

??The bus matrix provides access from a master to a slave, enabling concurrent access and efficient operation even when several high-speed peripherals work simultaneously. The 64-Kbyte CCM (core coupled memory) data RAM is not part of the bus matrix and can be accessed only through the CPU. This architecture is shown in

??其架構和之前的STM32F1x區別還是挺大的。由上可知,CCM共64KB,是直接掛在D-bus上的,除了CPU(即Cortex-M核)之外,誰都無法訪問。此外,由于CCM不屬于BusMatrix的一部分,所有也就不能被其他組件訪問,例如DMA控制器。
??對于CCM,CPU能以最大的系統時鐘和最小的等待時間從CCM中讀取數據或者代碼。官方文檔說明了使用CCM的一些優勢:比如將頻繁讀取的數據放到CCM,將中斷函數放到CCM,這都能加快程序的執行速度。

如何使用

使用方式一

??知道了這塊特殊內存,那么我們怎么來使用他呢?常用Keil的人應該知道,在其配置中,有如下選項:

??在默認情況下,其中的IRAM2我們不選中,現在我們就可以選中該部分。這樣,Keil在生產代碼時,就會自動將變量分配到該部分RAM中了。具體的可以打開,Keil生成的.map文件看看。

Execution Region RW_IRAM2 (Base: 0x10000000, Size: 0x00005ce4, Max: 0x00010000, ABSOLUTE)Base Addr Size Type Attr Idx E Section Name Object0x10000000 0x00005ce4 Zero RW 16003 .bss ram2.oExecution Region RW_IRAM1 (Base: 0x20000000, Size: 0x0001b360, Max: 0x00020000, ABSOLUTE, COMPRESSED[0x000000c8])Base Addr Size Type Attr Idx E Section Name Object0x20000000 0x00000001 Data RW 264 .data pbuf.o0x20000001 0x00000001 Data RW 909 .data api_msg.o

注意:

  • 如果僅僅定義幾個變量,可能Keil不會將其放到該RAM中。
  • 我在用的時候,沒有選中RAM2,Keil仍然把部分內存放到了RAM2中,不知為啥!
  • ??但是,這樣就有一個問題:由于其只能被內核訪問,一旦Keil將例如DMA用的內存放到了該部分RAM中,那么DMA將不能工作! 那么怎么使用更合適呢?

    使用方式二

    ??如前所說,直接讓編譯器自動分配貌似不太合適,所以我們可以自己指定分配的內存。這其中也有兩種方式。
    ??第一種依靠分散加載文件(.sct),更強大,直接定義一個文件(例如,名字為 RAM2.c),將所有要放得變量均放到該文件中,然后如下修改分散加載文件。

    LR_IROM1 0x0800C000 0x00100000 { ; load region size_regionER_IROM1 0x0800C000 0x00100000 { ; load address = execution address*.o (RESET, +First) ; 中斷向量表*(InRoot$$Sections).ANY (+RO) }RW_IRAM1 0x20000000 0x00020000 { ; RW data.ANY (+RW +ZI)}; 指定使用CCMRW_IRAM2 0x10000000 0x00010000 {RAM2.O (RAM2,+RW +ZI)} }

    ??還有一種方式就是直接使用編譯器指令:__attribute__+at。在定義變量時,如下即可:

    UINT32 EventNum __attribute__((at(0x10000000))) = 0;

    ??當然,這種方式也可以稍微變化一下,使用__attribute__+section。給變量指定一個節區名字,然后在分散加載文件中指定節區位置。
    ??如上處理編譯后,可查看map文件對應部分內存中變量的分配了。

    關于系統

    ??我這搞這部分的時候,正好用了FreeRTOS。于是就像既然這部分只能給內核訪問,為了內存的合理利用,能不能直接將這部分內存給系統,剩下的給不就是想怎么用就怎么用了么?而且分給FreeRTOS 64KB的內存正好符合我的設計需要!
    ??了解了上面的分散加載文件后,要將FreeRTOS放到RMA2中就非常簡單了,根據使用的FreeRTOS的文件,只需要如下的分散加載文件即可。

    RW_IRAM2 0x10000000 0x00010000 {port.o (+RW +ZI)queue.o (+RW +ZI)tasks.o (+RW +ZI)heap_4.o (+RW +ZI); 其他的用到的FreeRTOS的.o文件 }

    ??這樣就又有一個問題,如果使用動態申請的內存,則內存還是在RAM2中,如果傳遞給DMA時,則會出錯!

    注意:
    ??1. FreeRTOS中部分文件只有代碼,沒有數據(RW和ZI),例如:list.c,這樣就不能放到上面的分散加載文件中

    注意事項

    • 需要了解ARM的分散加載文件。
    • 需要了解個別的編譯器指令

    參考文檔

    • STM32F407 Reference manual

    總結

    以上是生活随笔為你收集整理的STM32 之五 Core Coupled Memory(CCM)内存的全部內容,希望文章能夠幫你解決所遇到的問題。

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