- 问题1:个人的理解,MSP430复位之后,根据复位中断向量首先会调用_c_int00_noexit()函数。
我是通过断点监控预启动程序 _system_pre_init(),发现它是被位于$\ccsv6\tools\compiler\msp430_4.3.3\lib\src路径下的boot.c
中的_c_int00_noexit()函数所调用,因而得出此结论。
所以可以认为_c_int00_noexit()函数的首地址是整个程序的入口地址。
这一点,在编译得到的map文件中也得到了印证。在map文件的最开始,有如下描述:
ENTRY POINT SYMBOL: "_c_int00" address: 0000e000
这个地址与map文件中描述的_c_int00_noexit()函数的地址一致!
我现在的问题是,_c_int00_noexit()函数的这个地址,是否可以按照需要进行指定??
我尝试了修改boot.c文件中对_c_int00_noexit()函数的定位,但是不起作用!??
- 问题2:如何在汇编跳转指令中调用C语言中定义的地址变量。我有试过网上找到的几篇文章介绍的方法,行不通。能否给出具体例程?
- 问题3:如何在汇编跳转之后,返回之前的程序地址。我测试发现,强行用汇编跳转到一个函数的首地址,函数执行完后,无法返回之前的地址,程序死了。
- 问题4:如果定义了某个函数,但它在程序中没有被调用,那么编译之后,CCS不会给这个函数分配相应的地址空间。
但我只想为这个函数分配一个地址空间,而不想去调用它,可行吗?
对于这个问题,大家如果有兴趣,又装了CCS的话,很容易就试出来了:
定义一个函数,但程序里不去调用它,然后编译,通过查看map文件,可以发现map文件根本没有为这个函数分配任何的地址空间。
本帖最后由 darkduck 于 2015-4-9 17:25 编辑
果然难度很大!
挑个软柿子捏捏,问题4感觉是被编译器优化了。调整编译器的优化设置有可能能够解决这个问题。
我把优化等级设成 off,结果一样。
其实这个问题,如果有在用CCS,很容易就试出来了。
本帖最后由 darkduck 于 2015-4-9 17:23 编辑
果然是有难度的问题,可以去TI官方论坛提问,相信TI的工程师会出来解答
TI MSP430论坛
难度是比较大,说一下自己的理解吧
1、复位之后的位置应该是芯片内部固定死的,因为复位的时候什么内容都没有执行,总得让机器知道从哪儿开始吧,所以这个应该是定死的,就像51的程序必须从0000H开始一样。至于文件里定义的地址应该是告诉编译器把这段程序放到什么位置的,而且必须放到指定位置。至于你说的修改了不起作用,不知道是什么原因了,应该是编译器对你的这种错误操作有个修正。
2、汇编调用变量应该是用地址调用吧?在定义C变量的时候规定绝对地址就行了吧,没有用过,自己想的。
3、编译器在C函数里调用C函数之前会有有些保护当前地址之类的操作的。你可以在CCS里看汇编和C共存的模式时看一下。你用汇编调C函数的时候没有保存原来的地址,更没有用汇编返回原来的地址,当然就不行了。
4、CCS里面用#pragma CODE_SECTION(funname, "ramfuncs");应该可以吧,具体的说不清楚了,应该是可以的。
没有实践经验,纯属个人想法。大家集思广益!
第一个问题,貌似是可以的,IAR下有人做过,CCS不清楚。如果我没记错的话,是修改MCU的启动文件。
第三个,不知道你是怎么强制跳转的。如果是直接写PC指针的话,肯定不行的,因为你没有保存需要返回的函数的信息。直接用跳转指令不就可以了吗?
不知道楼主是做什么的,怎么会用到这么奇怪的操作?破解么
mspgcc这些问题都比较好弄,ccs没仔细折腾过帮顶了
楼主的这几个问题,都源自于没有看这两本书:
SLAU132
SLAU131
有文档时就要先看文档, ---自己观点. 看什么都比不上看文档好.
本帖最后由 dontium 于 2015-4-11 18:50 编辑