我用的SST的51单片机,程序空间是从0000h到FFFFh,我定义的从0000h到5FFFh是单片机运行用的程序存储空间,从6000h到BFFFh是备份程序空间,不写入运行用的程序,后边的是当Flash用,所以不管汇编还是C程序都放在6000h以前的空间。汇编代码在地址上分成两部分,主要运行的部分从0000h到4600h,中间4600h到5500h是空白的,后边5500h到5FF4h这块地址上是一部分固定地址的代码,C函数只能放在4600h到5500h之间空白的地址段上。
汇编文件是一个.A51文件,C函数文件是一个.C文件,再加上头文件一共是3个文件,如果我不指定C函数的地址,那么连接器就把前边的A51主程序的固定和不固定的两部分算做同一部分了,从MAP文件中看就是把0000h到5FF4h全分给汇编文件了,把C文件分配到整个汇编文件以后的空间,就是5FF4h以后,这样就造成了程序跑到6000h以后去运行,结果就是开始我说的单片机认为程序访问了不可用的地址,复位去了。
我用了一个网上说的办法给C函数分配程序存储地址,就是在Keil中的project-> options for target '...' -> LX51 Locate-> User Segments里边加入?PR?_FUNCTION?CFILE(0x4600) 让连接器给C函数分配到指定地址去,但是这时候一连接就出错了,错误代码分别是L108、L121、L120,我看了下错误说明说是不能进行地址跳转,这个程序段的地址不可用……到这我就不知道怎么办了,中间那部分存储器空间明明是空的,为什么不让访问绝对地址给C文件分配到那里去呢?难道光设置Keil不行,在程序上还要有什么指令才可以分吗?
怎么把C函数指令地址定义到汇编文件中间空余的部分去,请求指点。