日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/20 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 瑞萨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區域的方式進行合作,好處是對雙方來說方便靈活,雙方互不干擾,壞處就是中間可能會遇到各種奇奇怪怪的問題,不過遇不到問題如何進步呢,通過這個項目后,對單片機底層的一些運行機制更了解了,這也是很大的一個進步。

永遠保持一顆進取的心,加油!!!

? ? ? ? ? ? ? ?

總結

以上是生活随笔為你收集整理的瑞萨RL78系列单片机划分ROM、RAM区域进行合作开发的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。