这个用C怎么写

[复制链接]
375|20
 楼主 | 2019-1-23 10:56 | 显示全部楼层 |阅读模式
void (*reset)(void)=0x00000000;
假入我现在想把reset();放在从0x00000400处开始的位置,请问用C怎么写???

编译环境是GCC+studio
| 2019-1-23 10:59 | 显示全部楼层

汇编格式 指明一下代码的位置。
C就不用指明位置了,编译器自动处理。所以说C方便嘛

使用特权

评论回复
 楼主 | 2019-1-23 11:02 | 显示全部楼层
楼上没明白我的意思啊

使用特权

评论回复
| 2019-1-23 11:11 | 显示全部楼层

难道你是想在400H的位置调用reset程序
这要绝对定位了
用汇编比较好,C的话没有标准方法,取决于编译器

使用特权

评论回复
 楼主 | 2019-1-23 11:15 | 显示全部楼层


我想在未用地址多插入几条reset();实现软复位

winavr+studio里面不知道怎么实现

或者烧写芯片的时候可以填充JMP  0x00000000吗???

使用特权

评论回复
| 2019-1-23 11:19 | 显示全部楼层
这个你得研究一下编译器的手册,不然直接用汇编操作吧

使用特权

评论回复
 楼主 | 2019-1-23 11:25 | 显示全部楼层

void (*reset)(void)=0x00000400;
这样不可以吗?

使用特权

评论回复
 楼主 | 2019-1-23 11:29 | 显示全部楼层


我是要把reset();存放在0x00000400开始的地址

不是运行reset();就让PC指向0x00000400

使用特权

评论回复
| 2019-1-23 11:35 | 显示全部楼层
在链接的时候指定吧

使用特权

评论回复
| 2019-1-23 11:39 | 显示全部楼层
这个用法在C标准里面是未定义的,就是说取决于编译器与硬件。

使用特权

评论回复
| 2019-1-23 11:44 | 显示全部楼层

楼主这个问题这么些人都答不上来 那么说明你这个问题可能本身没啥意义 可能是走上歧途了 方法有问题 思路有问题
连我这个C语言高人(据说现在大部分人不敢说自己精通C语言,但是本人不仅仅是精通C,而是极其精通C语言) 都没看明白

建议换个方法........

使用特权

评论回复
| 2019-1-23 11:47 | 显示全部楼层
把reset设为全局变量,然后用链接脚本指定存放位置和运行位置就OK了啊

使用特权

评论回复
 楼主 | 2019-1-23 11:51 | 显示全部楼层


高人:有一段代码,我就是想把这段代码从指定地址开始存放
就这样

使用特权

评论回复
| 2019-1-23 11:53 | 显示全部楼层


1、C语言里代码定位是可以的,但都是个性化产品,没有标准答案;
2、C语言里要实现“在未用地址多插入几条reset();”用不着指定地址。

使用特权

评论回复
| 2019-1-23 11:58 | 显示全部楼层

这不是编译器的事情,这是连接器(linker)的工作。
不同的开发环境有不同的设置方式

使用特权

评论回复
| 2019-1-23 12:01 | 显示全部楼层
用的编译环境不一样,不太清楚,不过感觉和上面的一样,指定起始位置还是用汇编简单些

使用特权

评论回复
| 2019-1-23 12:04 | 显示全部楼层

利用GCC特性吧,attribute 机制,LZ自己查查资料吧,很简单

你知道的不用的物理地址区可以单独定义为一个链接段,这个段里边放上N个指针,指针类型就是你的函数指针的类型,程序里边把你实际的复位函数名赋值给这些变量就OK了

使用特权

评论回复
| 2019-1-23 12:08 | 显示全部楼层
汇编实现就更简单啦,你直接在那些地址上放放跳转指令就OK了,不过这已经不属于玩C的范畴

使用特权

评论回复
| 2019-1-23 12:10 | 显示全部楼层


编写链接文件,RO区

使用特权

评论回复
 楼主 | 2019-1-23 12:13 | 显示全部楼层

OK,懂了,多谢大家

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

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