查看: 3620|回复: 9

[求助] keaz128---memory map

[复制链接]

该用户从未签到

14

主题

64

帖子

0

注册会员

Rank: 2

积分
147
最后登录
2018-9-28
发表于 2016-12-19 16:26:55 | 显示全部楼层 |阅读模式
各位好:
在.ld文件中可以进行memory分区,然后可以在Processor Memory Map中进行查看,这个分区是这样操作吗?我在.ld文件的memory中加入m_p (RW) :ORIGIN = 0x00016000,LENGTH = 0x00002000    但是Processor Memory Map中并未出现相应的修改,有对这方面了解的师兄进行帮助吗?
我知道答案 目前已有9人回答
回复

使用道具 举报

该用户从未签到

712

主题

6371

帖子

0

超级版主

Rank: 8Rank: 8

积分
24861
最后登录
2025-7-18
发表于 2016-12-19 16:35:11 | 显示全部楼层
楼主你好!
请参考我这篇文章:
https://www.nxpic.org.cn/module/forum/thread-580565-1-1.html
回复 支持 反对

使用道具 举报

该用户从未签到

14

主题

64

帖子

0

注册会员

Rank: 2

积分
147
最后登录
2018-9-28
 楼主| 发表于 2016-12-19 16:47:37 | 显示全部楼层
小恩GG 发表于 2016-12-19 16:35
楼主你好!
请参考我这篇文章:
https://www.nxpic.org.cn/module/forum/thread-580565-1-1.html ...

我到还没有试实际效果,只是看编译后的那个Processor Memory Map没有变化,而我在论坛找了一个程序看到它改了以后,Processor Memory Map与我的不一样,然后我只改了他的长度,但是Memory Map 没有变化,让我感觉像没有效果一样
回复 支持 反对

使用道具 举报

该用户从未签到

712

主题

6371

帖子

0

超级版主

Rank: 8Rank: 8

积分
24861
最后登录
2025-7-18
发表于 2016-12-19 17:27:22 | 显示全部楼层
number573 发表于 2016-12-19 16:47
我到还没有试实际效果,只是看编译后的那个Processor Memory Map没有变化,而我在论坛找了一个程序看到它 ...

你看下代码,你ld文件里面还缺少一部分。
回复 支持 反对

使用道具 举报

该用户从未签到

14

主题

64

帖子

0

注册会员

Rank: 2

积分
147
最后登录
2018-9-28
 楼主| 发表于 2016-12-20 08:05:37 | 显示全部楼层
小恩GG 发表于 2016-12-19 17:27
你看下代码,你ld文件里面还缺少一部分。

我是参考这个代码写的,还缺哪一部分呢?
MEMORY {
  m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x000000C0
  m_text      (RX) : ORIGIN = 0x00000410, LENGTH = 0x00015BF0
  m_data      (RW) : ORIGIN = 0x1FFFF000, LENGTH = 0x00004000
  m_parameter (RX) : ORIGIN = 0x00016000, LENGTH = 0x00004000
  m_cfmprotrom  (RX) : ORIGIN = 0x00000400, LENGTH = 0x00000010
}
/* Define output sections */
SECTIONS
{
  /* The startup code goes first into INTERNAL_FLASH */
    .m_parameter :
  {
  __ROM_SYMBOLS = .;
     . = ALIGN(4);
    KEEP(*(.m_parameter)) /* Startup code */
    . = ALIGN(4);
  } > m_parameter
回复 支持 反对

使用道具 举报

该用户从未签到

712

主题

6371

帖子

0

超级版主

Rank: 8Rank: 8

积分
24861
最后登录
2025-7-18
发表于 2016-12-20 09:28:36 | 显示全部楼层
number573 发表于 2016-12-20 08:05
我是参考这个代码写的,还缺哪一部分呢?
MEMORY {
  m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH  ...

这样写:
.mycode :
  {
  __ROM_SYMBOLS = .;
  . = ALIGN(4);
  KEEP(*(.romsymbols))
  . = ALIGN(4);
  } > m_parameter

编译后,你在map中搜索mycode,会发现放在了m_parameter定义的flash地址中。
如果你在这个段中定义一个常量,比如:
__attribute__((section (".romsymbols"))) char test[4] ={0x55,0xAA,0x55,0xaa};
你会发现:
.mycode         0x0001e000        0x4
                0x0001e000                __ROM_SYMBOLS = .
                0x0001e000                . = ALIGN (0x4)
*(.romsymbols)
.romsymbols    0x0001e000        0x4 ./Sources/main.o
                0x0001e000                test
                0x0001e004                . = ALIGN (0x4)
回复 支持 反对

使用道具 举报

该用户从未签到

14

主题

64

帖子

0

注册会员

Rank: 2

积分
147
最后登录
2018-9-28
 楼主| 发表于 2016-12-20 13:10:34 | 显示全部楼层
小恩GG 发表于 2016-12-20 09:28
这样写:
.mycode :
  {

谢谢版主,一会我试一下。
今天中午又发现一个新问题是FLASH1_Erase,将整个定义的romsymbols都擦出了,指出擦出的字节大小也没有用,这是什么原因?
Cpu_DisableInt();
        MyFlash_Ptr = FLASH1_Init(NULL);
        Error_flash=FLASH1_Erase(MyFlash_Ptr,0x00016000,sizeof(TxData));
        while(!DataWrittenFlg)
        {
                FLASH1_Main(MyFlash_Ptr);
        }
        DataWrittenFlg = FALSE;
        Error_flash = FLASH1_Write(MyFlash_Ptr,data,0x00016000,3);
        while(!DataWrittenFlg)
        {
                FLASH1_Main(MyFlash_Ptr);
        }
        DataWrittenFlg = FALSE;
        //End_flash = FLASH1_GetOperationStatus(MyFlash_Ptr);
        if(FLASH1_GetOperationStatus(MyFlash_Ptr)==LDD_FLASH_FAILED)
        {}
        TxData[0] = *((uint8_t *)0x00016000);
        TxData[1] = *((uint8_t *)0x00016010);
        TxData[2] = *((uint8_t *)0x00016015);
        //IFsh1_SetByteFlash(0x0001fc00,0x55);
        //IFsh1_GetByteFlash(0x0001fc00,&TxData[0]);
        Cpu_EnableInt();


TxData[1]和2都是0xff
回复 支持 反对

使用道具 举报

该用户从未签到

712

主题

6371

帖子

0

超级版主

Rank: 8Rank: 8

积分
24861
最后登录
2025-7-18
发表于 2016-12-20 16:21:04 | 显示全部楼层
number573 发表于 2016-12-20 13:10
谢谢版主,一会我试一下。
今天中午又发现一个新问题是FLASH1_Erase,将整个定义的romsymbols都擦出了,指 ...

你如果擦除romsymbols所在的flash sector,那当然会擦掉。
如果你想擦除的sector,但是又想保留其中的某些数据,那么只能先读出来,然后擦除,再写入。
回复 支持 反对

使用道具 举报

该用户从未签到

14

主题

64

帖子

0

注册会员

Rank: 2

积分
147
最后登录
2018-9-28
 楼主| 发表于 2016-12-20 16:32:30 | 显示全部楼层
小恩GG 发表于 2016-12-20 16:21
你如果擦除romsymbols所在的flash sector,那当然会擦掉。
如果你想擦除的sector,但是又想保留其中的某 ...

我一开始以为擦除是按照那个函数后面参数的字节数,是我理解错了,那只能先读再擦除了再重新写入。版主除了这种方式还有哪种能更方便点吗?
回复 支持 反对

使用道具 举报

该用户从未签到

712

主题

6371

帖子

0

超级版主

Rank: 8Rank: 8

积分
24861
最后登录
2025-7-18
发表于 2016-12-20 16:36:59 | 显示全部楼层
number573 发表于 2016-12-20 16:32
我一开始以为擦除是按照那个函数后面参数的字节数,是我理解错了,那只能先读再擦除了再重新写入。版主除 ...

要么你就把数据放到程序不需要擦除的块里面, 常量归常量放一个专用的sector, 其他需要擦除的放其他的sector。也就是一开始你就设置好。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-7-18 22:51 , Processed in 0.106172 second(s), 30 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表