前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何使用sct文件、icf文件来定位不同的内存存储变量(cortex-m3平台)keil+iar

如何使用sct文件、icf文件来定位不同的内存存储变量(cortex-m3平台)keil+iar

作者头像
用户4645519
发布2022-05-09 19:50:54
7830
发布2022-05-09 19:50:54
举报
文章被收录于专栏:嵌入式学习嵌入式学习

完整的文章:https://www.cnblogs.com/CodeWorkerLiMing/p/13755436.html

好久没写博客了,快到国庆了,经历了一些项目和坑,还是要保持记录的好习惯,好记性不如烂笔头嘛。

    目前使用了cortex-m3内核的两款单片机:stm32f1和lpc1768的,虽说是cm3内核,但是两个芯片添加的外设是有区别的,很多外设的使用方式也是各有千秋,st在国内比较火,全国研讨会如火如荼,每年都有。lpc1768是属于NXP半导体,前身是飞利浦半导体,也算是老牌的半导体公司,相比较stm32,国内入门的论坛没有stm32火爆,但我相信质量过得去。

    两款单片机都是比较老了,stm32f1是2007年发布的,lpc1768是估计2009年左右,具体不清楚,我是看标准库上是这个日期,因此猜测。

    虽然不是老的芯片,但是市场依然有供应。

    可以作为arm入门的基础芯片。

    stm32f103zet是512flash,64ksram,而且是连续的sram分布,那么程序上使用基本上不用过多考虑;而lpc1768也是有64ksram的,但是是分为3个区域的,32ksram作为普通的sram,和stm32f1类似,使用无区别,但是另外两个16kb的内存空间是在另外的地址空间,手册原文:

    The LPC17xx contain a total of 64 kB on-chip static RAM memory. This includes the main 32 kB SRAM, accessible by the CPU and DMA controller on a higher-speed bus, and two additional 16 kB each SRAM blocks situated on a separate slave port on the AHB multilayer matrix.

    LPC17xx总共包含64 kB片上静态RAM存储器。 其中包括可由高速总线上的CPU和DMA控制器访问的主32 kB SRAM,以及位于AHB多层矩阵上独立从端口上的两个附加16 kB SRAM块。

    总结起来就是,32ksram的起始地址0x1000 0000,大小0x8000=64kb

    两个附加16 kB SRAM块的起始地址0x2007C000,而且是连续的,下面的计算可见一斑。

hex(0x2007C000+0x8000)= 0x20084000

hex(0x2007C000+0x4000)= 0x20080000

因此在keil设置中,可以设置两个32kb的内存空间,而且如果使用了分散加载文件,那么两个附加16 kB内存就可以完全利用起来了,lpc1768这个设计的原因是想两个内存空间可以再单片机运行的过程中,分别取数据,快加usb和ethernet数据的读写,和普通的变量区分开来————论坛大佬解释的。具体链接找不到了。。

    如何使用呢?sct文件的使用参考了硬汉论坛的pdf文档,H7系列的。

    我这里首先使用stm32来演示下:

代码语言:javascript
复制
     ; *************************************************************
 ; *** Scatter-Loading Description File generated by uVision ***
 ; *************************************************************
LR_IROM1 0x08000000 0x00080000  {    ; load region size_region
   ER_IROM1 0x08000000 0x00080000  {  ; load address = execution address
    *.o (RESET, +First)
    *(InRoot$$Sections)
    .ANY (+RO)
    .ANY (+XO)
   }
   RW_IRAM1 0x20000000 0x00008000  {  ; RW data
    .ANY (+RW +ZI)
   }
   ; RW data - 32KB SRAM
   RW_IRAM2 0x20008000 0x00008000 {
   *(.RAM_D1)
   }
 }

我把64kb分成两个32kb的空间,

ac6.14编译器实例:

定义全局变量:

代码语言:javascript
复制
     __attribute__((section (".RAM_D1"))) uint32_t AXISRAMBuf[10];
     __attribute__((section (".RAM_D1"))) uint32_t temp = 0;

下面的语句也是合法的,

    uint8_t   UART_TX_BUF10  __attribute__((section(".ARM.__at_0x2000B00A")));    //就是将串口发送的数据定位到RAM中起始地址为0X2000b00A

    编译之后,可以在map文件看到这几个变量的具体地址

代码语言:javascript
复制
     temp                                     0x20008000   Data           4  main.o(.RAM_D1)
     AXISRAMBuf                               0x20008004   Data          40  main.o(.RAM_D1)
     UART_RX_BUF                              0x2000b000   Data          10  main.o(.ARM.__at_0x2000b000)
     UART_TX_BUF                              0x2000b00a   Data          10  main.o(.ARM.__at_0x2000B00A)

那么就是成功的,ac5有待研究

lpc1768的芯片小技巧:

使用iar编译器,测试通过,也记录下:

使用两个sram的方法参见博客链接:

https://cloud.tencent.com/developer/article/1997795

定义变量,int val_addr @0x2007C000;

编译后map文件如下:

val_addr                0x2007'c000    0x4  Data  Gb  main.o 1

成功!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-09-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档