瑞萨RL78系列单片机划分ROM、RAM区域进行合作开发

一、引言

      最近在开发中需要了一些问题,在此记录一下以便日后查看,如果有其他开发者与需要了类似的问题,也可以借鉴一下

二、背景

      我们公司有个项目使用的是其他公司开发的PCB板,我们负责流程部分的开发,称为应用层开发,PCB板厂家负责硬件相关的驱动开发,例如串口通信,按键和显示等,称为底层开发。如此,便需要两家在同一个单片机内进行开发,在此之前我们也进行过合作,双方都是用的C语言,由我这边编译成一个LIB库文件提供给对方。但是此项目不同,我们这边有一个大神级的人物带领的团队一直使用汇编语言进行开发,这个PCB板一开始是他们团队与对方合作开发的,所以采用的双方各使用单片机内使用不同部分的ROM和RAM进行开发,中间划出一块共享的RAM进行数据交互,双方开发互不影响,各自生成一个HEX文件,最终进行合并。

三、开发过程

    第一步:既然是双方使用不同的ROM和RAM区,那么就先划一下吧,我使用的开发环境是瑞萨提供的CS+,那就先用IDE来划一下吧,刚才是的配置如下:

      

配置好之后会生成一个.dr文件在工程里

好了,先编译一下吧,不编不要紧,一遍吓一跳,200多个错误,

没变法,硬着头皮找原因吧

首先看到第一句,Segment '?CSEGOB0' at C0H-4H。看到C0这个地址,心中了然,这个地址是配置字的地址,必须给他划一块区域才行,于是,直接在dr文件中修改如下

重新编译后错误数量由200变成了199。。。有进步!!!

看一下下面的错误,基本上都是同个类型的错误,找到一个错误变量的定义发现定义如下前面有两个关键字volatile __sreg

__sreg是将变量定义到直接寻址区,想起了以前做过一个CLASSB认证的项目也是划分的RAM,先参考一下

RAM区没什么问题,STACK是栈空间,Seg_0是一块特定的数组使用的空间,与本项目无关,NewMemoryArea_0 : ( 000ffe20H, 000001e0H )这块区域是干什么的呢?打开芯片手册查找一下

找到如下说明:

能对应起来了,这块区域就是短直接寻址区,先加上试试

编译,竟然通过了,哈哈哈哈,真是欣喜若狂呀。。。。。。

第二步:调试

      既然编译通过了,那么总得调试吧,可是启动部分在对方那里,如何调试呢。询问了大神团队,他们是如何调试的,告知他们是将对方的HEX文件DB成了一个一个的数据,然后进行调试,好吧,那就借鉴一下。

     问大神团队要来了DB成数据的汇编文件(他们开发了一个工具可以将HEX文件转为汇编的数据文件),加入到工程里。编译,报错如下:

看了一下报错的地址,都是划分给对应的区域,看来调试的时候应该把对放的ROM区也包含进来才行,修改dr文件

编译,通过。DownLoad,竟然很顺利的写入了,超出预期,运行到了程序起始地址

在自己的函数入口加入断点,成功进入,貌似一切都很顺利。那么就让程序跑起来吧

第三步:运行程序

          程序运行起来了,哎,怎么感觉运行的不正常呢,停下来看看,结果发现了两个惊人的问题

1、全局变量没有初始化,例如定义了int a = 10; 结果运行后 a依然是0,想想就释然了,全局变量初始化也是需要代码来执行的,对方启动后肯定不会为我初始化全局变量区,我自己也没有做,幸好这种初始化的全局变量没有用到几个,我手动初始化就是了。

2、const数组全都变成了FF,这个问题就比较严重了

地址是 F3XXX?不在我划分的ROM区内,有妖气!!!

找一下芯片手册

F3000到FCEFF是镜像区域,镜像区域解释如下

将芯片RESET后发现一开始数据不为FF

转到汇编中单步运行下看看

发现运行到第二句的时候变成FF的,看来是这个PMC捣的鬼,对方将PMC置为1了,所以映射的是10000到1FFFF的地址了,


 

我代码里的配置PMC为0,先改成同对方一致的吧,配置方法如下:

编译后果然报错,提示“RA78K0R error E3206: Segment '@@CNST' can't allocate to memory - ignored”

这是CNST区域不够了

我们之间的区域划分如下,

我只有13000~13FFFF这个区间内的0x1000个字节的数据可以映射到镜像区域,显然不够啊,看来只能放弃对镜像区域的使用

仔细读了一下镜像区域的解释,使用镜像区域是可以不使用段寄存器ES,这不就是near和far的区别?先把const数据配置成far试一下,在IDE中的配置如下

编译通过,Download运行,发现数据正常了,运行后也出现了预计的结果

到此先告一段落,运行一段时间后再去排查一下是否还有其他问题

四:总结

    使用这种划分RAM和ROM区域的方式进行合作,好处是对双方来说方便灵活,双方互不干扰,坏处就是中间可能会遇到各种奇奇怪怪的问题,不过遇不到问题如何进步呢,通过这个项目后,对单片机底层的一些运行机制更了解了,这也是很大的一个进步。

永远保持一颗进取的心,加油!!!

               

猜你喜欢

转载自blog.csdn.net/klq666888/article/details/89640585