瑞萨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区域的方式进行合作,好处是对双方来说方便灵活,双方互不干扰,坏处就是中间可能会遇到各种奇奇怪怪的问题,不过遇不到问题如何进步呢,通过这个项目后,对单片机底层的一些运行机制更了解了,这也是很大的一个进步。

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

               

  • 14
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 2015年,瑞萨公司发布了RL78单片机的例程LED程序。该程序利用单片机的高效能力,实现了对LED灯的控制。LED灯的亮度可以在程序中进行设置,并可以实现灯的闪烁和循环显示功能。该例程采用了C语言编写,并使用了瑞萨公司的RL78 IDE程序进行开发开发者只需要按照程序的要求进行编译,即可实现对LED灯的控制。该程序还提供了丰富的注释和说明,方便开发者快速上手。此例程不仅适用于初学者,也适用于具有一定单片机开发经验的工程师,在实际开发中可以根据需要进行修改和优化。瑞萨公司的RL78单片机以其稳定性、高效性和低功耗等优势得到了广泛应用,在各种应用中都能够实现精准的控制和高效的数据处理。本例程的推出,进一步提高了瑞萨公司在单片机领域的竞争力,为广大开发者提供了更加便捷的开发平台和技术支持。 ### 回答2: 2015年瑞萨rl78单片机例程 led程序是一种编程语言,主要用于控制瑞萨rl78单片机驱动LED灯。这个例程是学习与实践单片机控制技术的入门项目。通过这个例程,可以学习单片机编程的基础知识、硬件设计和调试技巧。 该程序使用C语言编写,主要实现控制Led灯的亮灭。在程序中,需要先定义端口,然后设定为输出口。接着通过循环控制LED的亮灭,实现不同闪烁速度和频率,最终实现LED的控制。 通过这个例程,可以深刻了解单片机的驱动原理和硬件接口设计,掌握编程语言的基本概念和编程流程,同时培养编程思维和实践能力。 总之,2015年瑞萨rl78单片机例程 led程序是一项非常有意义的学习项目,对于掌握单片机控制技术和拓展相关领域的学习和发展具有非常重要的意义。 ### 回答3: 2015年,瑞萨公司推出了RL78单片机,该单片机极其适合制作控制系统和物联网应用。在该单片机上运行的LED程序,可以通过简单的电路和编程完成亮度和颜色的设置,具有广泛的应用前景。 LED程序需要通过代码实现各种功能,比如闪烁、流水灯和呼吸灯等。编码时需要理解单片机的工作原理和寄存器配置,掌握最基本的指令和数据操作。这个过程需要耐心、实践和持之以恒,不仅可以加深对光电器件和单片机原理的理解,还能帮助提高编程技能。 LED程序不仅可以用于实际物理控制,例如控制电灯、显示屏等,还可以用于虚拟应用领域。例如,可以通过搭载了单片机的微型电路板制作LED灯饰,极大地丰富了人们的生活体验。 总之,瑞萨RL78单片机例程中的LED程序,是物联网、控制系统和嵌入式应用领域的重要组成部分,深受各类应用领域工程师和编程者的青睐。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值