打印

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

[复制链接]
10043|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 | 只看该作者
做个记号

使用特权

评论回复
5
香水城| | 2010-8-4 08:39 | 只看该作者
最近在IAR for STM8上 写bootloader。遇到了一些问题
不像其他的IAR版本有操作RAM的__ramfunc
我看了IAR的手册,还是一头雾水。

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


这个新玩艺儿,俺还没有空把玩,你是先锋,有什么心得分享一下吧,:lol

使用特权

评论回复
6
yewuyi| | 2010-8-4 09:22 | 只看该作者
section不能在C程序中定义。

这个应该是在连接文件,例如*.XCL中定义的。

使用特权

评论回复
7
yewuyi| | 2010-8-4 09:24 | 只看该作者
在C程序中可以指定把某个函数放到某个section中,具体如何指定,你可以查一下IAR对应的编译器手册。

使用特权

评论回复
8
crazybee| | 2010-8-4 10:09 | 只看该作者
char *targetAddr     = __section_begin(" MYRAM");  

targetAddr     不会得到正确的值,就是发了这个BUG,IAR 那边回复说下个版本修正!

使用特权

评论回复
9
zhuleigogo|  楼主 | 2010-8-4 10:13 | 只看该作者
9# crazybee

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

有个网友,建议使用by copy 直接在存储到ram中

使用特权

评论回复
10
zhuleigogo|  楼主 | 2010-8-4 10:16 | 只看该作者
其实还可以使用内存地址0x100直接代替*targetAddr
就是把他复制到内存0x100以后

使用特权

评论回复
11
wqz| | 2010-9-26 15:31 | 只看该作者
不知楼主搞定了没有?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

7

帖子

0

粉丝