IAR中如何在C程序中定义section,以及在icf中初始化段

[复制链接]
10856|10
 楼主| zhuleigogo 发表于 2010-8-3 08:58 | 显示全部楼层 |阅读模式
AR中如何在C程序中定义section,以及在icf中初始化段

比如我想在IAR的C程序中定义一个section,这个section只有一个函数
然后我想在icf中来初始化section,再在C程序中把这个section 的程序copy到ram中运行
实现步骤是
1)在C程序中定义一个section。如何定义?哪是段的开始与结束
2)在icf中如何来设置这个section?
     因为要先存在flash中,然后再在ram中定义。
3)在c程序中使用memcpy()


我自己看了IAR的手册,第一次接触,还是不理解,那位高手给个解
 楼主| zhuleigogo 发表于 2010-8-3 11:43 | 显示全部楼层
1)在C程序中定义一个section。如何定义?哪是段的开始与结束
有两种方法
1.#pragma  section = “MYSECTION”
fun()
{

}
2. fun()  @ "MYSCTION"
{
}


在icf中如何来设置这个section?
我自己的理解是
在RAM里面定义一段区域用于存储copy的code
define block MYRAM  with size = __MYSIZE__,alignment = 4 {};
initialize manually { section MYRAM* };  //no init my section
place in NearData      { block MYRAM }; //NearData  == RAM

place in FarFuncCode     { ro section MYSECTION }; // flash



在c程序中实现copy code to ram
void CopyToRam()
{
  char *targetAddr     = __section_begin(" MYRAM");
  char *sourceAddr     = __section_begin("MYSECTION ");
  char *sourceAddrEnd  = __section_end("MYSECTION ");
  int __MYSZE__= sourceAddrEnd - sourceAddr;
  memcpy(targetAddr, sourceAddr, size);
}



我按照自己的理解,表达的肯定不对
谁能把他按照规范的IAR写出来啊,这样就可以实现在IAR中写stm8的bootloader了
 楼主| zhuleigogo 发表于 2010-8-3 11:52 | 显示全部楼层
最近在IAR for STM8上 写bootloader。遇到了一些问题
不像其他的IAR版本有操作RAM的__ramfunc
我看了IAR的手册,还是一头雾水。

香水城,期盼你能解决我们的疑问
hotpower 发表于 2010-8-4 06:00 | 显示全部楼层
做个记号
香水城 发表于 2010-8-4 08:39 | 显示全部楼层
最近在IAR for STM8上 写bootloader。遇到了一些问题
不像其他的IAR版本有操作RAM的__ramfunc
我看了IAR的手册,还是一头雾水。

香水城,期盼你能解决我们的疑问 ...
zhuleigogo 发表于 2010-8-3 11:52


这个新玩艺儿,俺还没有空把玩,你是先锋,有什么心得分享一下吧,:lol
yewuyi 发表于 2010-8-4 09:22 | 显示全部楼层
section不能在C程序中定义。

这个应该是在连接文件,例如*.XCL中定义的。
yewuyi 发表于 2010-8-4 09:24 | 显示全部楼层
在C程序中可以指定把某个函数放到某个section中,具体如何指定,你可以查一下IAR对应的编译器手册。
crazybee 发表于 2010-8-4 10:09 | 显示全部楼层
char *targetAddr     = __section_begin(" MYRAM");  

targetAddr     不会得到正确的值,就是发了这个BUG,IAR 那边回复说下个版本修正!
 楼主| zhuleigogo 发表于 2010-8-4 10:13 | 显示全部楼层
9# crazybee

难怪,我昨晚调试了一晚,始终不行

有个网友,建议使用by copy 直接在存储到ram中
 楼主| zhuleigogo 发表于 2010-8-4 10:16 | 显示全部楼层
其实还可以使用内存地址0x100直接代替*targetAddr
就是把他复制到内存0x100以后
wqz 发表于 2010-9-26 15:31 | 显示全部楼层
不知楼主搞定了没有?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

7

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部