fb_1234 发表于 2011-4-22 23:09:22

在msp430单片机里,怎么面规定内存使用片区

来个有难度的,请教各位:
第一个问题:在msp430单片机里,怎么面规定内存使用片区?比如:F5418的内存空间是0x1C00~0x5BFF,跑程序的时候无论局部变量还是全局变量,只让他们使用0x1C00~0x3BFF的这一段空间
第二个问题:在msp430单片机里,怎么实现应用程序里面去调用一个固定地址的函数,相当于把程序分成两段
一段作为应用程序,一段作为驱动程序,应用程序里面去调用一个固定地址的驱动程序,应用程序和驱动程序分别可以单独编译和升级
关键在可以单独编译和升级,单独升级的意思是,生成的机器码可以合成,合成后使用正常,这样可以降低应用程序和驱动程序耦合度

fb_1234 发表于 2011-4-26 16:43:07

应用程序和驱动程序可以分别维护,责任就比较明确了

liuzq1981 发表于 2011-4-26 16:51:36

第一个问题,要指定RAM地址,那就用汇编吧。
第二个问题,FLASH都有起始地址,比如0X1100,加上你的程序量空间(预留一部分),比如0X3000,那么0X4100以后的FLASH可以用作它用,比如存储数据。

总之要事先规划好数据的存储地址,然后到指定区域操作,RAM可以用汇编指定地址,FLASH可以和INFO FLASH操作一样进行擦写。

fb_1234 发表于 2011-7-30 11:25:46

回复【楼主位】fb_1234
-----------------------------------------------------------------------

目前我已经想办法实现了上面的所有想法

1.第一个问题,通过修改*.xcl文件可以规定内存的使用范围,不一定一定要使用汇编语言

2.第二个问题比较难处理,但是还是有办法的,主是要分开实用的Flash 和Ram的空间,将两个程序的所有地址分开,留下一段公共的Ram 区,一个函数调用接口,两个程序通过函数调用接口进行跳转,通过公共Ram区进行交互,要注意的是1.堆栈的大小2.SO库中的全局变量,太多了

有兴趣了解的可以交流交流,mail:fb_1234@163.com

Zphoenix 发表于 2011-7-30 15:19:17

回复【楼主位】fb_1234
-----------------------------------------------------------------------

1.可以使用section限定内存空间,可以将变量或函数定义在多个自定义的section中。
2.使用函数指针就可以
typedef void (*funcP)(void);

funcP func = (funcP)0xCCCCCC;
func();

一般为驱动程序建立一个入口函数表,并将该表放置在固定的地址,应用程序通过该表中保持的入口函数地址,调用驱动程序功能。

fb_1234 发表于 2011-9-8 10:50:31

回复【4楼】Zphoenix
-----------------------------------------------------------------------

如果功能函数放在工程里面一起编译,这个功能函数不能单独升级,因为函数里面还有局部变量是要占用CONST20的,编译的时候CONST20又不知道放在具体的那个位置,所以无法做到单独升级,还是有耦合

tuzihog520 发表于 2011-9-10 18:08:36

还是不能理解各位大侠的言语!
还要好好的学习!

rengo 发表于 2011-9-25 22:06:36

看ti手册
slaa341

ccmj4708 发表于 2012-2-24 21:21:59

mark

fb_1234 发表于 2012-6-20 13:33:13

我可以把做好的*.xcl发给有兴趣的大神

下面是跳转接口,用汇编写,就是说我要调用BIN代码里面的函数的时候先调用APPcode里面的接口,比如说调用采集函数APP里面调用CALL_QUERY();就完事了,直接能跳到BIN里面去
注意:
1.BIN是一个独立的工程,但是里面不能有中断,或者有中断也行,不能和APP的中断重合
2.通过*.xcl分配好APP和BIN的Flash空间,不能有重合,例如:-P(CODE)CODE=9002-EFFF,10000-18FFF规定了的Flash空间是9002-EFFF,10000-18FFF两段
3.需要代码合成,举例:
比如APP生成机器码的时候有@FA00一段和@FB00一段,对以APP的工程来说@FB00一段是跳到自己的测试代码,而跳不到BIN代码的QUERY函数,所以APP要删除@FB00的一段,BIN要删除FA00的一段,这样就完成了代码的合成;
4.这种函数调用全部都是无参数的,需要参数的话要定义一段公共的内存,APP和BIN都可以操作,举例:
MSP430F5418的内存空间是1C00~5BFF,可以分配1C00~2BFF个给APP使用,2C00~3BFF给BIN使用,3C00~5BFF用作公共变量来传递APP和BIN之间的参数

说到这里相信很多人都能实现独立工程编译,机器码合成后协同工作的目标了

;用户自定义函数声明
EXTERN        QUERY       
EXTERN        CONTROL
EXTERN        IEC_INIT
EXTERN        IEC_CLOSE
; 导出函数名给C语言函数
PUBLIC        CALL_QUERY
PUBLIC        CALL_CONTROL
PUBLIC        CALL_IEC_INIT
PUBLIC        CALL_IEC_CLOSE



                //PUBLIC JUMPFUNCTION
                RSEG CODE
//JUMPFUNCTION
                ASEG
                ORG 0xFA00;place at the bottom of APP code
CALL_QUERY:
        calla                #QUERY1
        reta
CALL_CONTROL:
        calla                #CONTROL1       
        reta               
CALL_IEC_INIT:
        calla                #IEC_INIT1
        reta               
CALL_IEC_CLOSE:
        calla                #IEC_CLOSE1
        reta       
       
                ORG 0xFB00;place at the start of BIN code
QUERY1:       
        calla                #QUERY       
        reta               
CONTROL1:
        calla                #CONTROL       
        reta               
IEC_INIT1:
        calla                #IEC_INIT
        reta               
IEC_CLOSE1:
        calla                #IEC_CLOSE
        reta       

       
END

dadongleilei 发表于 2012-6-20 16:08:40

单片机的高手!目前我做到的是程序整体的升级 没有把应用和驱动独立开来
页: [1]
查看完整版本: 在msp430单片机里,怎么面规定内存使用片区