8869|17

70

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

怎样用C语言定义绝对地址 [复制链接]

使用5系列的430单片机,写bootload,不知道用C语言怎么样对地址进行定标,用汇编很容易实现,但是430的汇编我不是很熟悉,还有就是在主程序中怎么实现跳转,当主程序收到上位机发来的下载程序的命令,要跳转到bootlaod区去,用C语言怎么实现。
这些以前用PIC的汇编语言写过,用起来很方便,但是不知道430中的C语言怎么进行绝对地址定标。还有我用的IAR4.20不支持#pragma codeseg(rom)指令,搞不清楚怎么定标,希望高手帮助一下。

最新回复

我也在找这个方法,但是一无所获.  详情 回复 发表于 2011-7-13 16:27
 
点赞 关注

回复
举报

80

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
#pragma location =
不知道这样行否
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
4.20没用过,你这样试下:
void fuction(vid)@"myseg"
{
……
……
……
}
myseg在XCL文件里定义
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

4
 
这样#pragma location= 0xXXXX或unsigned short Var @0xXXXX
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

5
 
还想问一下,我在主程序中要下boot的时候,要跳转到boot程序里,用C语言这么实现
 
 
 

回复

54

帖子

0

TA的资源

一粒金砂(初级)

6
 

没用过

引用:

还想问一下,我在主程序中要下boot的时候,要跳转到boot程序里,用C语言这么实现
关注~~~~
 
 
 

回复

54

帖子

0

TA的资源

一粒金砂(初级)

7
 
定义一个函数指针  指向boot的首地址 ?
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

8
 
请sjzd说的具体一点怎么使用,举个例子。
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

9
 
比如程序里用软件复位
可以写个函数指针指向地址0
(*(void(*)())0)();
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

10
 
可以void fuction(vid)@"myseg"这样用,那就把boot程序放在程序的最后面,但是如果要调用的子程序的话那就要对每个子程序分配地址空间。如我的boot区要这样写
void bootload(void)@“myseg”{
init_usart();
while(1){
function()
}
}
void init_usart(void)@“myseg1”{
......
}
void funtion(void))@“myseg2”{
}
这样在内存中定义的话要反汇编,把每段程序的占用的地址空间看出来,再进行code段的定标,很麻烦,有没有简单一点的办法实现,让boot区的子程序自动编译在最后,减去认为算空间的问题,不然以后boot要改起来很麻烦!希望高手指点,还有就是使用#pragma location是不可以进行在flash中进行程序段地址定标的。
请知道的大虾不吝赐教。
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

11
 
引用:

定义一个函数指针 指向boot的首地址 ?
好方法!~!
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

12
 
但是自己编写的监控程序一般都是放在程序的最后面,用的是公司自己的协议,这段监控程序又有好几个子程序,想把这些个程序都放在程序的最后,不用我说的方法,请教用函数指针这么做啊。
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

13
 
有空参考下
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

14
 
修改XCL文件,用#pragma codeseg或#pragma location,函数指针,可以方便地实现.
 
 
 

回复

99

帖子

0

TA的资源

一粒金砂(初级)

15
 
请问ynybc假如有多个子程序要放在程序的最后,用你的办法这么定义啊?可以据个例子嘛?
我这个样子做也是在XCL文件中改的
void bootload(void)@“myseg”{
init_usart();
while(1){
function()
}
}
void init_usart(void)@“myseg1”{
......
}
void funtion(void))@“myseg2”{
}
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

16
 
在XCL文件中不用IAR的空间分配,自己修改Constant data部分和 Code部分的分配空间,如原来的定义为:
// ---------------------------------------------------------
// Constant data
// ---------------------------------------------------------

-Z(CONST)DATA16_C,DATA16_ID,DIFUNCT=E000-FFDF


// ---------------------------------------------------------
// Code
// ---------------------------------------------------------

-Z(CODE)CSTART,ISR_CODE=F000-FFDF
-P(CODE)CODE=F000-FFDF



现在0xE000~0xE7FF空间自定义一个段BOOT_SEGMENT,定义改为:
// ---------------------------------------------------------
// Constant data
// ---------------------------------------------------------

-Z(CONST)DATA16_C,DATA16_ID,DIFUNCT=E800-FFDF


// ---------------------------------------------------------
// Code
// ---------------------------------------------------------

-Z(CODE)CSTART,ISR_CODE=E800-FFDF
-P(CODE)CODE=F000-FFDF

// ---------------------------------------------------------
// BOOT_SEGMENT
// ---------------------------------------------------------

-Z(CODE)BOOT_SEGMENT =E000-E7FF

用户自定义的BOOT_SEGMENT段的大小最好为512字节的倍数,开始地址为430中FLASH每一个segment的首地址,这样方便flash空间的擦写。


修改好XCL文件后,就在C文件中将boot用到的所有函数分配到BOOT_SEGMENT段中:
Void fun1( void ) @ ”BOOT_SEGMENT”
{

}


Void fun2( void ) @ ”BOOT_SEGMENT”
{

}


Void fun3( void ) @ ”BOOT_SEGMENT”
{

}
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

17
 
还有人提出宝贵意见?
 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(中级)

18
 

回复 10楼 tvn 的帖子

我也在找这个方法,但是一无所获.
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
【回帖赢京东卡】说说无线技术那些事儿
即日起—2月28日,参与回帖讨论都有机会赢取【30元京东卡】

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表