余白 Copyright © 2010-2017,2023 てきーらサンドム


■■■ V850ES,RH850の屋根裏部屋 ■■■

 ルネサス製マイコンV850ES、RH850に関する情報ページです。デバイスや開発ツールについて,注意点,使いこなしのポイント,落とし穴,裏技,雑学などをトピックスとして掲載しています。
 @依然として、FLMD1端子(P10_8ピン)にプルダウンをつけ忘れる事例が見られます。注意事項が別冊のマニュアルになっていて見落としているのが原因と思いますが、RH850初心者はくれぐれも注意してください。
 Aスマート・コンフィグレータを使用する上で、セクション設定の変更とboot.asmの修正が必要です。これに関する記述が簡単に見つからないため、RH850初心者はくれぐれも注意してください(詳細はRH850総合を参照)。
 V850は終息ファミリなので新規設計に使うと泣きを見ます。後継のRH850は車載限定ファミリであり、情報を積極的に開示していないので、一般人は使えません。ということで、このページもフェードアウト予定でしたが、ぽつぽつと車載がらみの仕事が来てしまうので、しばらくは残すかも・・・。

最近の更新以前の更新
2023/11/29 [RH850総合]"近況"を更新
2023/11/10 [RH850総合]"近況"を追加
2023/10/31 [RH850総合]"RESETOUT端子に注意"を追加
2023/10/03 [RH850総合]"RH850/F1KMのメモリ・アクセス効率向上"を更新
2023/09/30 [RH850総合]"RH850/F1KMのメモリ・アクセス効率向上"を追加
2023/09/30 [資料室] RH850/F1KMおよびスマート・コンフィグレータ関連のドキュメント追加
2023/09/27 [RH850総合]"スマート・コンフィグレータ使用上の注意"を更新
2023/09/26 [RH850総合]"スマート・コンフィグレータ使用上の注意"を追加
2023/08/06 [資料室] E1/E20,E2エミュレータ ユーザーズマニュアル別冊 RH850F1KH,F1KM 注意事項を追加
2017/02/04 [RH850総合]"内蔵RAMとセクション配置"を追加
2017/01/22 [ハードウエア]"コアのトレンド"を更新

 


●RH850総合

近況】 2023/11/29 更新
 久しぶりに850の記事を書いていたら無性にボードを作りたくなってしまいました。(「紹介ページ」)。以前作ったSAMC21-can5実験ボードのマイコンをRH850F1KMに換えただけなんですけどね。テストプログラムも掲載しました。
 
RESETOUT端子に注意】 2023/10/31 追加
 F1KMではP8_6、F1L/F1HではP0_0がRESETOUT端子となります。リセット中は必ず'L'が出力されるので、入力ポートとしては使用しないほうが良いです。特に'H'を出力する可能性のある相手との接続は避けるべきです。
 F1KMではオプションバイトの設定でRESETOUT機能を無効に設定できますが、無効になるのはリセット解除後であり、リセット中はやはり'L'が出力されます。デフォルトのオプションバイトでは有効になっており、うっかり設定を忘れてボードを動かすことも考えられるのでやはり入力ポートとして使うのは避けたほうが良いでしょう。
 また最初はオープンドレイン出力になるため、'H'を出力するには外付けプルアップ抵抗を付けるか、プッシュプル出力へ変更する必要があります。プッシュプル出力に変更するには保護レジスタ用の書込みシーケンスでPODCnレジスタを操作する必要があり、ちょっとだけ面倒です。
 F1KMではオプションバイトの設定でRESETOUT機能を無効に設定すれば、リセット解除後は通常のポートと同じ初期状態になるため、PMレジスタに0を書くだけでプッシュプル出力に変更できます。
 
スマート・コンフィグレータ使用上の注意】 2023/9/27 更新
 スマート・コンフィグレータ自体の使用方法はマニュアル見ればなんとなくわかるかもしれませんが、そのコードを組み込んだプロジェクトをビルドするためには、
  ・ビルドツールのプロパティ→リンカ・オプション→セクション→セクションの開始アドレスの変更
  ・プロジェクト直下のboot.asmの修正
 が必要になります。変更・修正しないと割込みが正常にかかりません。これほど重要な情報が、なぜか簡単に見つからないのですよ(特に初心者には)。
 
 (1)セクションの開始アドレスの変更
  デフォルトの設定は、RESET,EIINTTBL/%ResetVectorPE1%,.const,.INIT_DSEC.const,.INIT_BSEC.const,.text,.data(以下略)
  ですが、スマート・コンフィグレータが生成するベクターテーブルのセクション名がソース上はEIINTTBLにも拘わらず実際にはEIINTTBL.constとなるため、上記内のEIINTTBLの直後に.constを追記する必要があります(ドットを見落とさないように)。
  なおかつ512バイトアライメントで配置しなければならないので、上記.constの手前に移動します。結局次のような設定になります。
  RESET/%ResetVectorPE1%,EIINTTBL.const,.const,.INIT_DSEC.const,.INIT_BSEC.const,.text,.data(以下略)
  あるいはEIINTTBL.constに単独に開始アドレスを割り当てます。
  RESET/%ResetVectorPE1%,EIINTTBL.const/0200,.const,.INIT_DSEC.const,.INIT_BSEC.const,.text,.data(以下略)
 
 (2)boot.asmの修正
  @25行目にコメントアウトされた下記行があるので、アンコメントします。これはスマート・コンフィグレータを使わないときも同じです(固定ベクターテーブルを使う場合の共通処置)
    ;USE_TABLE_REFERENCE_METHOD .set 1  → ; を削除します。
  A147〜154行目(.section "EIINTTBL", const行〜.endm行)をコメントアウトします(削除すると以降の行数が変わるので注意)。スマート・コンフィグレータはr_cg_intvector.cにベクターテーブルを出力します。
  B210行目(mov #__sEIINTTBL, r6)を削除して、下記2行を追加します(スマート・コンフィグレータが出力するベクターテーブルを指定)。
    .extern _INT_Vectors
    mov #_INT_Vectors, r6
   あるいは下記1行でも問題ないようです。
    mov #__sEIINTTBL.const, r6
  C271〜274行目(mov ICBASE, r10行〜set1 6, 4[r10]行)は不要なので削除しても良いです(ICBASEの値が正しければ削除しなくても問題ないです→ICBASE値が異なるファミリに流用する場合は問題になります)。
 特定のファミリについては上記修正済みのsc_boot.asmが用意されています。C:\Program Files (x86)\Renesas Electronics\SmartConfigurator\RH850の下の各プロジェクトの下の方にあります。ファミリによってはICBASEの値が異なるのですが、ICBASEを参照している部分がコメントアウトされているので、それについては気にしなくて良いです。ここに格納されたサンプルプロジェクトの説明書は、例えばKM用はこちらになります。
 
RH850/F1KMのメモリ・アクセス効率向上】 2023/10/3 更新
 アクセス高速化とコードサイズ低減をしたい場合は、ビルド・オプション変更とちょっとしたソース変更で対応できます。まぁ劇的に改善されるわけではないので、忙しい人は無視してもかまいません。
 なぜ改善できるかというと、デフォルトでは32bit空間で変数・定数のアクセスをしているのですが、KMはFROM4MB以下、RAM512KB以下しかないので空間を制限した短い命令でもアクセス可能だからです(直アドレス指定の場合)。
 具体的な命令の違いは以下のようになります。
  ・32bit空間:4バイト命令x2個でアクセスしています。つまりコード・サイズ8バイトで必ず2クロックかかると言うことです。これがデフォルト設定で使用される命令です。
  ・23bit空間:6バイト命令x1個で特定レジスタから±4MB範囲でアクセスすることができます。FROMはKM-S4(4MB)でも全域アクセス可能です。RAMもLRAM,GRAM含めて全域をアクセス可能です。
  ・16bit空間:4バイト命令x1個で特定レジスタから±32KB範囲でアクセスすることができます。大きなテーブル以外は大概このサイズに収まるでしょうから、おおきなテーブルだけ23bit空間に配置し、その他は16bit空間に配置するのが良いでしょう。

■23bit空間のみまたは16bit空間のみに対応にするには、(1)ビルド・オプション変更、(2)cstart.asmの変更 だけで済みます。C言語ソースの変更は必要ありません(変数がLRAMに収まる範囲なら)。
 変更箇所は以下の通りです。変数アクセスにepレジスタを使用する例です。
 (1)ビルドオプション
  @共通オプション→レジスタモード→epレジスタの扱い→「プロジェクト全体で固定する(-Xep=fix)」を選択。
  Aコンパイルオプション→出力コード→データのデフォルトセクション→「ep_disp23(-Xsection=data=ep_disp23)」または「ep_disp16(-Xsection=data=ep_disp16)」を選択。
  Bコンパイルオプション→出力コード→定数のデフォルトセクション→「zconst23(-Xsection=const=zconst23)」または「zconst(-Xsection=const=zconst)」を選択。
  Cリンクオプション→セクション→セクションの開始アドレス→「RESET/%ResetVectorPE1%,EIINTTBL.const/0200,.zconst,.text,.zconst23,.INIT_DSEC.const,.INIT_BSEC.const,.edata,.edata23/0800,.stack.bss,.ebss,.edata.R,.edata23.R,.ebss23/セルフ領域開始位置」
   ただしconstやbss,dataを使用するライブラリ関数を使用する場合は、それらも追加します。
   RESET/%ResetVectorPE1%,EIINTTBL.const/0200,.zconst,.text,.zconst23,.const,.INIT_DSEC.const,.INIT_BSEC.const,.edata,.edata23,.data/0800,.stack.bss,.ebss,.edata.R,.edata23.R,.ebss23,.bss,.data.R/セルフ領域開始位置
  Dリンクオプション→セクション→ROMからRAMへマップするセクション→「.edata23=.edata23.R」または「.edata=.edata.R」を追加(dataセクションを使用しない場合は.data=.data.Rを削除)。
 (2)cstart.asmの変更
  @.dw #__s.data, #__e.data, #__s.data.R → dw #__s.edata23, #__e.edata23, #__s.edata23.R または dw #__s.edata, #__e.edata, #__s.edata.R
   ただしdataセクションも使う場合は、元の記述の下に追加します。
  A.dw #__s.bss, #__e.bss → .dw #__s.ebss23, #__e.ebss23 または .dw #__s.ebss, #__e.ebss
   ただしbssセクションも使う場合は、元の記述の下に追加します。
 B.section ".data", dataから2行を下記に変更(ただしdataセクションも使う場合は、元の記述の下に追加します)
   .section ".edata23", EDATA23
   .L.dummy.edata23:
   または
   .section ".edata", EDATA
   .L.dummy.edata:
  C.section ".bss", bssから2行を下記に変更(ただしbssセクションも使う場合は、元の記述の下に追加します)
   .section ".ebss23", EBSS23
   .L.dummy.ebss23:
   または
   .section ".ebss", EBSS
   .L.dummy.ebss:

 23bit空間の場合はGRAMもアクセス可能ですが、リンカがタコなため自動的にアクセス禁止領域を避けて配置するということができません。禁止領域に配置されてもエラーが出ません。従ってGRAMを使用する場合はGRAMアドレスから配置するセクション名を新たに作って、Cソース上で配置を明示することになります。

■16bit空間+23bit空間、あるいは変数2空間(ep,gpレジスタの併用)にするには、上記変更に加えて、C言語ソースの中で別空間に配置する変数・定数を明示する必要があります(#pragma section指令で設定)。
 変更箇所(デフォルトの出力セクションをLRAMの16bit空間とし、GRAMにも別途16bit空間を配置し、さらに23bit空間も併用する例)
 (1)Aで「ep_disp16(-Xsection=data=ep_disp16)」を選択。
 (1)Bで「zconst(-Xsection=const=zconst)」を選択。
 (1)Cで、.edata23の後ろに,.sdata,.sdata23を追記し、さらに/セルフ領域開始位置の後ろに,.sbss23,.sbss,.sdata.R,.sdata23.R/GRAM開始アドレス を追記。ただしKM-S1は.ebss23の後ろに追記。
 (1)Dで示した2行に加え、.sdata23=.sdata23.R .sdata=.sdata.R も追加。
 (2)@で示した2行に加え、edataをsdataに書き換えた2行も追加。
 (2)Aで示した2行に加え、ebssをsbssに書き換えた2行も追加。
 (2)Bで示した4行に加え、edataをsdataに書き換え、EDATAをSDATAに書き換えた4行も追加。
 (2)Cで示した4行に加え、ebssをsbssに書き換え、EBSSをSBSSに書き換えた4行も追加。
 
const, data, bssを使用しない場合の配置
ROM配置(KM共通) LRAM配置(KM-S1) LRAM配置(KM-S2,S4) GRAM+リテンション配置 GRAMバンクB配置
0000 0800〜 cstart初期化関連データ
(INIT_DSEC〜sdata23)

64KBmax.
初期値付変数
(.sdata)
初期値なし変数
(.ebss23)
初期値付変数
(.sdata23)
初期値付変数
(BANKB.sdata23)
定数(zconst23) 初期値なし変数
(.sbss)
初期値付変数
(.edata23)

64KBmax.
初期値付変数
(.sdata)
バンクB
開始アドレス→
初期値なし変数
(BANKB.sbss23)
コード(text)/2MBを超える
場合はjarl32, jr32オプション
設定必要 

64KBmax.
初期値付変数
(.edata)
 ↑
64KBmax.
初期値付変数
(.edata)
初期値なし変数
(.sbss)
定数(zconst)/30KBmax. 初期値なし変数
(.ebss)
初期値なし変数
(.ebss)
GRAM
開始アドレス→
初期値なし変数
(.sbss23)
0000 0200〜 EI割込み参照テーブル セルフ領域
開始アドレス→
スタック
(stack.bss)
セルフ領域
開始アドレス→
スタック
(stack.bss)
0000 0000〜 リセット、FE割込み
凡例
その他 R0レジスタからの相対アクセス epレジスタからの相対アクセス gpレジスタからの相対アクセス
注:初期値付変数のRAM上のセクション名には.Rが付くがソース上の#pragma sectionでは.Rを付けない。
 
const, data, bssも使用する場合
ROM配置(KM共通) LRAM配置(KM-S1) LRAM配置(KM-S2,S4) GRAM+リテンション配置 GRAMバンクB配置
0000 0800〜 cstart初期化関連データ
(INIT_DSEC〜data)
初期値付変数
(.data)
初期値付変数
(.data)
初期値付変数
(.sdata23)
初期値付変数
(BANKB.sdata23)
定数(const)   初期値なし変数
(.bss)
初期値なし変数
(.bss)

64KBmax.
初期値付変数
(.sdata)
バンクB
開始アドレス→
初期値なし変数
(BANKB.sbss23)
定数(zconst23) 
64KBmax.
↓ 
初期値付変数
(.sdata)
  初期値なし変数
(.ebss23)
初期値なし変数
(.sbss)
 
コード(text)/2MBを超える
場合はjarl32, jr32オプション
設定必要 
初期値なし変数
(.sbss)
初期値付変数
(.edata23)
GRAM
開始アドレス→
初期値なし変数
(.sbss23)
定数(zconst)/30KBmax.
64KBmax.
↓ 
初期値付変数
(.edata)
 ↑
64KBmax.
↓ 
初期値付変数
(.edata)
0000 0200〜 EI割込み参照テーブル 初期値なし変数
(.ebss)
初期値なし変数
(.ebss)
0000 0000〜 リセット、FE割込み セルフ領域
開始アドレス→
スタック
(stack.bss)
セルフ領域
開始アドレス→
スタック
(stack.bss)
 
内蔵RAMとセクション配置】 2017/2/4 追加
 RH850のRAM配置がV850ESコアとはずんぶん違いますね。E2Mですでに配置が違っていたみたいですが、私はE2Mを飛び越えてRH850を始めたので、今更ながらショックを受けました。
 『な、なんと、内蔵RAMが16bitディスプレースメントでアクセスできない位置にあるじゃないか!』
 ま、アセンブラ・マニアじゃないと分からないと思いますが、ld/st命令は、16bitディスプレースメント値+レジスタでアクセスするので、配列の先頭位置をディスプレースメントに格納して、レジスタをカウントアップしながら配列要素をアクセスすることができたんです。
 ところが、RH850/F1x(V850E2/Fx4)では、アドレス空間の一番上の16MバイトがIO空間になっているので、E2M以降で追加されたld23/st23命令(±4MBアクセス)ですらディスプレースメントでRAMを指定することができません。ld32/st32命令はG3コアにも無いので、1命令で配列の要素に連続アクセスすることができなくなったわけです(インデックス固定の1要素のみならgpまたはep相対でアクセスは可能)。うう・・・、か、悲しい。

 さて、一般の人に関係ない話はさておき、C言語しか使わない人でもRAMへのセクション配置(変数配置)は気になるところですね。セクション配置は、CC-RHではCA850と違ってビルドプロパティのオプションで設定するので、まずはその設定から始めました。
 ところで噂によると(RH850/F1xのマニュアルをダウンロードできないので、噂としか書けない^^;)、RH850/F1xの内蔵RAMは3種類あって、以下のようにアクセス速度が異なるようです。
 RH850/F1L: プライマリローカルRAM > セカンダリローカルRAM = リテンションRAM(ディープストップモードでも内容維持されるRAM)
 RH850/F1H: 自PEローカルRAM >> グローバルRAM = リテンションRAM > 他PEローカルRAM  (PEとはマルチコア品における各コアを示す)
 アクセスの速いプライマリ/自PEローカルRAMへ通常の静的変数を割り当てるのが望ましいということです。
 もちろん標準設定でもそうなっているのですが、標準では32bitレンジでアドレッシング可能な.bss(初期値無し変数)あるいは.data(初期値有り変数)セクションに割付されてしまいます。内蔵RAMしか使わない人間にとって、32bitアドレッシングは不毛なので、即オプション変更します。

 OSの制約が無ければ、基本的にはプライマリ/自PEローカルRAMへは.ebss, .edataセクション(epレジスタ相対の16bitアクセスエリア)を配置し、デフォルトで変数が.ebss, .edataへ割り付けられるようにします。デフォルトを変更するには、ビルドのプロパティで
 「共通オプション>レジスタモード>epレジスタの扱い」 → "プロジェクト全体で固定する" に設定。
 「コンパイルオプション>出力コード>データのデフォルトセクション」 → "ep_disp16" に設定。
すればよいです。さらに配置の指定は以下のようにします。
 「リンクオプション>セクション>セクションの開始アドレス」 → ROM配置テキストセクションの最後に".edata"を追加し、
             RAMの配置に".ebss, .edata.R/ローカルRAM開始アドレス" を追加、
             それに応じて他のセクションの配置位置を変更。
 「リンクオプション>セクション>ROMからRAMへマップするセクション」 → ".edata=.edata.R"を追加。
   (※CA850を使っていた感覚からするとROM上がebataで、RAM上がedata.Rなのは違和感を覚える(逆だろうと思う)がしょうがない)
 cstart.asm内の変数初期化テーブルに #__s.edata, #__e.edata, #__s.edata.R および #__s.ebss, #__e.ebss を追加(.dataや.bssの例に倣って)
 cstart.asm最後のダミー定義に edata, .ebss の定義を追加 (.dataや.bssの例に倣って)

 なおプライマリ/自PEローカルが64KB以上ある場合、.ebss23, .edata23セクション(epレジスタ相対の23bitアクセスエリア)を配置し、そこへの変数は
  #pragma section ep_disp23
   変数定義
  #pragma section default
と記述して割り付けます。
 「リンクオプション>セクション>セクションの開始アドレス」 → ROM配置テキストセクションの最後に".edata23"を追加し、
             RAMの配置を".ebss23, .ebss, .edata.R, .edata23.R/ローカルRAM開始アドレス" に変更。
 「リンクオプション>セクション>ROMからRAMへマップするセクション」 → ".edata23=.edata23.R"を追加。
 cstart.asm内の変数初期化テーブルに #__s.edata23, #__e.edata23, #__s.edata23.R および #__s.ebss23, #__e.ebss23 を追加
 cstart.asm最後のダミー定義に edata23, .ebss23 の定義を追加

 リテンションRAMのアクセスはep相対でも良いと思いますが、外部RAM使わないならgp相対アクセスでよいでしょう。
  #pragma section gp_disp16
   変数定義
  #pragma section default
と記述して割り付けます。
 「リンクオプション>セクション>セクションの開始アドレス」 → ROM配置テキストセクションの最後に".sdata"を追加し、
             RAMの配置に".sbss, .sdata.R/リテンションRAM開始アドレス" を追加。
 「リンクオプション>セクション>ROMからRAMへマップするセクション」 → ".sdata=.sdata.R"を追加。
 cstart.asm内の変数初期化テーブルに #__s.sdata, #__e.sdata, #__s.sdata.R および #__s.sbss, #__e.sbss を追加
 cstart.asm最後のダミー定義に sdata, sbss の定義を追加

 さらにセカンダリ/グローバルRAMを使う場合は、上記同様の方法で、.sbss23や.bss、あるいはユーザー指定のセクション配置すればよいです。ユーザー指定のセクションは、
  #pragma section セクション名   または #pragma section 属性指定文字 セクション名
   変数定義
  #pragma section default
と記述します。属性指定文字(gp_disp23とか)を省略した場合は、デフォルト属性となりますので、ep_disp16をデフォルトにした場合は、セクション名.ebssまたはセクション名.edataとなります。リンクオプションを指定するときはこの属性も含めて記述が必要です。名称自体に属性と同じ名前をつけても(たとえばxxx.ebss)、リンクオプションではxxx.ebss.ebssのようにさらに属性を付けて指定しなければなりません。

 もうひとつ、テキストセクションのデフォルト配置が0x00008000となっていますが、これは.zconst(定数のr0レジスタ相対16bitアクセス)範囲外です。割り込み関係に32KBも必要なんでしょうかね。とりあえず私は0x00001000に変更し、テキストセクションの先頭に定数エリアとして.zconst, .zconst23を追加しています。FLASH4MB品までは全部定数だとしても.zconst23でアクセスできるので、その後ろの.constは目ざわりだったら消します。定数のデフォルトの配置もコンパイルオプションで変更します。
 「コンパイルオプション>出力コード>定数のデフォルトセクション」  → "zconst"を設定。

 以上で、ようやくビルド環境設定が終わりです。ずいぶん手間だと思いますが、最初のプロジェクトで1回やっておけば後はほぼコピーでいけます。
 

 


●ツール総合(PM+,CA850 共通)

統合開発環境の種類】 2012/1/25 更新
 統合開発環境には,PM+(ぴーえむぷらす)とCubeSuite+(きゅーぶすいーとぷらす)の2系統がありますが,PM+はバージョンアップが凍結されており,いつ消えてもおかしくない状況です。CubeSuite+が問題なく動く環境をお持ちならPM+は使う必要が無いです。
 拙宅のWindowsXP環境ではCubeSuiteは重すぎるので,PM+のみ使い続ける予定でしたが,今年はCubeSuite+へ移行せざるを得ないですね。去年買った(今は妻に取られた)Win7環境のノートPCにはCubeSuite+はすんなりインストールできました。

 以下は2011/4/21時点。
 東芝の春モデルのノートPCを買いました(一番安い6万円のやつ)。Windows7 (32bit選択)です。でもって,PM+とCubeSuite入れてみました。
★PM+:インストール1回目でこけて,その直後に表示された”推奨設定で再インス−トル”で無事インストールできました。しかしPM+の画面からデバイスインストーラが起動できませんでした。Program Filesフォルダにアクセス制限ついているせいでしょう(Windows7デフォルトなのか初期設定したけーずでんきのお兄さんの設定なのか不明)。エクスプローラからの直接デバイスインストーラを起動してデバイス・ファイルが無事インストール完了。その後はPM+からも起動できるようになりました。ビルドも問題なく完了。(デバッガはまだ試していません)
★CubeSuite(Ver1.40):問題なくすんなりインストールできました。PM+用のプロジェクトを開くには,
 「ファイル」→「ファイルを開く」において,ファイルの種類をPM+用ワークスペース・ファイル(*.prw)を指定すればよいです。ビルドも問題なく出来ました。(デバッガはまだ試していません)
 CA850の他にCXコンパイラも使えるようになったようですが,良く調べたらV850E2M/Rコア品種からの適用のようです。当面は使う機会がなさそう。CA850用のソースからCX用ソースへのソース・コンバータが付いているので,逆に言えばソース記述は非互換らしいです。CXでは,8バイト型(long long int,double)や1ビット型(_Bool)の変数が使えます。また#defineマクロが可変引数対応になっています。
 CXとCA850のソースの違いについては,「CXコンパイラ ビルド編」の”付録B.3.4 変換仕様”を見ると分かります。
フリー・ツールの128K制限,256K制限】 2011/7/6 更新
 フリー・ツールのPM+,CubeSuiteのCA850(Ver3.4x)は128Kで制限でしたが,CubeSuite+のCA850(Ver3.50)は256K制限に緩和されました。制限に引っかかる方法が長らく分からなかったのですが,あるお方に教えていただきましたm(__)m。テキストセクションのサイズでした。メモリ上の位置に対しては制限はかかっていないので,128K,256Kよりも上に配置可能です。constセクションはフリーのようです。
 さらにCubeSuite+のCA850(binディレクトリ)をPM+のCA850(binディレクトリ)にコピーしても動きました(試す前にbinのバックアップをとって下さいね)。テキストセクションのサイズ128K越えを確認しました。もちろんCubeSuite+がサクサク動く環境なら,そんなことする必要はありませんが(^^;
オブジェクト・ファイル形式】 2011/7/12 更新
 ルネサスのFAQでELFと書いてありました,っていうかツール・メニューのオブジェクト解析ツールのダンプ項目にELFヘッダと書いてあるし。
 78K0Rと同様に256K超のtextセクションのヘキサ追加ユーティリティ作ろうと思いましたが,同じ方式では作れないことが判明しました(アセンブラソースだけ修正してもCソースからコンパイルされてしまう)。メモリ位置の制約がないことを利用するとV850の方が簡単に作れるかもしれません。
 でも,私の場合はtextセクションが256Kあれば当面不足しないので,しばらくはV3.50をコピーして使っていれば満足かな。
オブジェクト書込み時の注意】 2011/7/30 追加
本番用オブジェクトの書き込みは,次のようにします。
・MINICUBE2: デバッガで書き込むとデバッグ用モニタも書かれてしまうので,QB-programerでHexファイルを書き込みます。
・MINICUBE: ROM化後ファイル(romp.outまたはromp.hexなど)をデバッガでダウンロードします。デフォルトではROM化前のロードモジュール(a.outなど)がダウンロードされるため,デバッガ上では動いても単体では動かなくなります。

 


●V850ESハードウエア

Jx3→Jx3−Hの違い】 2011/6/11 追加
とりあえず注意点のみ記載します。
・PLLのリセット時初期値がマニュアルでは設定禁止になっている4逓倍になっています。つまり必ず設定が必要だということです。
乗算命令の不具合】 2011/4/21 更新 桃色が更新箇所。
 気がつきませんでしたが,乗算命令の不具合に伴う制限事項の通知が出ていました。対象はV850ESコア全製品のようです。
★DMA機能または外部バス機能を使っている場合は該当する可能性があります。
★C言語ソースの場合は,CA850コンパイラV3.42以降では回避コードが出ます。
  単体のフリー版は2011/1/27時点ではW3.40までしか掲載されていませんでしたが,
  2011/2月にW3.46が掲載されていたようです。いやーめでたし,めでたし。
★アセンブラ・ソースの場合は,mul/mulu命令のreg3がr0以外で,かつreg3≠reg2ならばOKのようです。reg3としてr0をダミーとして指定することがしばしばあると思われますが,その場合は2命令展開用にリザーブされているr1レジスタをダミーとして指定しておけばよいでしょう。
回路設計の手引き】 2011/4/8 追加
 デバッガとしてMINICUBE2を使う場合の回路設計チェックリストです。
端子  確認事項
DRST兼用端子 リセット時に'L'になること(一応プルダウン内蔵)。外部にプルアップや'H'出力デバイスあるいはTTL入力端子(注1)が接続されてないこと。特にコネクタ経由で別基板や別モジュールがつながる場合は,相手内部でプルアップされていたりTTL入力になっている可能性に十分注意すること。
FLMD1兼用端子(大抵PDL5と兼用) リセット時に'L'になること(外部プルダウン必須)。外部にプルアップや'H'出力デバイスあるいはTTL入力端子(注1)が接続されてないこと。特にコネクタ経由で別基板や別モジュールがつながる場合は,相手内部でプルアップされていたりTTL入力になっている可能性に十分注意すること。
RESET端子 リセット回路を付けること。ただし一部の品種(V850ES/Hxなど)はパワー・オン・リセット回路を内蔵しているので,その場合はプルアップすること。
FLMD0端子 1〜10kΩでプルダウンする。ただしセルフ・プログラミングを行う場合は10kΩプルダウンとし,プログラミング制御端子へ100Ω(保護抵抗)を経由して接続する。
デバッガ/書込み器接続端子 UART接続(TxD,RxDの2本)かCSI接続(SI,SO,SCK,H/Sの4本)かを選ぶ。UARTの方が端子数が少なくて済むが,実装工場のラインの書込み器がCSIで作り込まれている場合も考えられるので,量産ライン側の都合も確認のこと。
X1, X2端子 ・発振子以外の接続は推奨されていない。特にVRO(REGC端子出力電圧)を超える電圧を印加してはならない。
・発振子によってはX2端子側に直列抵抗が必要になる。発振子メーカに推奨回路定数を確認のこと(一部の品種はマイコンのマニュアルにも掲載されている)。
XT2端子 32.768kHz発振子を接続する場合,直列抵抗が大抵必要になる(実験的には無くても動作するが量産では必要)。具体的な値は発振子メーカに評価を依頼して決めるのが望ましい。
REGC端子 内蔵レギュレータの出力端子だが,他の回路の電源として流用しないこと。
マニュアルにはコンデンサの指定は特に書かれてないが,スタンバイ動作がある場合はリークの多いアルミ電解は使用しない。一般的にはB特性またはR特性の積層セラミックか,タンタル電解を接続する。
D/A出力端子 今のところバッファ内蔵品は無いので,オペアンプを外付けする。フルレンジで出力したければ,レールtoレール入出力(入出力フルスイング対応)のオペアンプを選ぶ。マニュアルにはJFET入力型と指定されているがCMOSオペアンプでも良い。
A/D入力端子 ノイズ低減用に100pF以上のコンデンサを入力端子−GND間に入れるのが望ましい。
電源端子 同時に印加できない場合(特にVrefを別電源から作る場合)は,EVdd→Vref→Vddの順に印加する。
その他入出力端子 一般的な注意事項を「電気的特性」欄あるいは「端子機能」の等価回路図から読み取っておくこと。
・入力レベル(ハイレベルが0.8EVddの端子と0.7EVddの端子がある)
・出力レベル(端子によってドライブ能力が異なる。特にアナログ兼用端子は低い)
・入出力回路形式の端子ごとの違い(5Vトレラント,シュミット,オープン・ドレインなど)
注1.TTL入力端子からは電流が流れ出る。すなわち'H'レベル出力だと思うこと。最近TTLを使う機会が少ないため,うっかり忘れることがある。
Jx3→Hx3の違い】 2011/2/15 追記
 とりあえずV850ES/HJ3をぼちぼち動かし始めましたが,早速オプション・バイトの罠にはまってしまいました。
 タイマやUARTのタイミング系が全て2倍になってしまっていたのですが,デバッガでSFRの値を確認しても間違いは見つからず,たまたまクロック系を眺めていたところオプションバイトがあることに気がつきました。
 マニュアルには書かれてませんが,どうやらオプションバイトの2バイト目を0にするとPLL前段の1/2プスケーラが1/1になってPLL出力が2倍になってしまうようです。つまり恐ろしいことに64MHzクロックで動作していたということですね。もともとHJ3だけはFJ3と同じダイを使っているらしいので48MHz動作は楽勝らしいですが,常温とは言え64MHzでも動くとは恐れ入りました。
項目 V8050ES/Jx3 V850ES/Hx3
オプション・バイト Jx3は無し,Jx3-Lはあり。  あり。しかもJx3-Lとも内容が異なる。 
タイマのレジスタ名,割り込み名 TMP,TMQ TAA,TAB
UARTのレジスタ名,割り込み名 UAxxx UDxxx
IIC(2線シリアル・インタフェース)の割り込みフラグ名,マスクフラグ名
(IIC制御レジスタは変更無し)
IICIF0,IICMK0   IIC0IF,IIC0MK
3線シリアル・インタフェースのクロック入力の一部変更
(CBnCKS2-0 = "110"の場合のクロック・ソースの違い)
ボーレート・ジェネレータfBRGmのクロックを使う。 ・チャネルによってクロック・ソースが異なる。
・チャネル0は従来どおりボーレート・ジェネレータだが,ボーレート・ジェネレータ自体の入力がfxx→fxへ変更になっている。
A/Dの変換クロック数選択 66〜675クロック 32〜512クロック
クロック生成回路のデフォルト動作 リセット後は自動的にメインクロック(外部発振)がオン,デフォルトCPUクロックは8分周。 リセット後は8MHz内蔵発振器で動作,CPUクロックは1/1(8MHz),メインクロックはオフ。
ポート制御レジスタ PFnレジスタでオープン・ドレイン指定。
(PUnレジスタ無し)
PUnレジスタでプルアップ指定。
(PFnレジスタ無し→PF9Hレジスタのみあり
LVIの割り込み名 INTLVI(検出電圧を超えた場合および下回った場合) ・INTLVIL(検出電圧を下回った場合)
・INTLVIH(検出電圧を超えた場合)

コアのトレンド】 2017/1/22 更新
 V850ESは,汎用系の主力MCUで使われていたコアです。車載用はV850E2コア、RH850G3コアに移行していますが,汎用系はフェードアウトのようですね。
 各アーキティクチャのPDFマニュアル:  E1 ES E2 E2M G3K G3M
 
汎用系のシリーズ構成】 (2010年夏)
  V850ES/Jx3, Jx3-L シリーズ V850ES/Hx3シリーズ V850ES/Kx2シリーズ
特長 主流品種。3.3V系。 5V系。リセット回路, 高速内蔵発振回路, プルアップあり。 古い。3.3V, 5V系両用。プルアップ豊富。
入手性(RSコンポーネンツなど) △(品名によっては入手可)
(1世代前のJx2の方が入手しやすいかも)
× △(品名によっては入手可)
内蔵パワーオン・リセット × あり ×
内蔵高速発振器 × あり (8MHz) ×
プルアップ抵抗オプション × あり (P7,Cx,DL除く) あり (P7除く)
5Vトレラント入力 あり × ×
内蔵タイマ TMP (数本, 汎用),
TMQ (1本, 多相用),
TMM (1本, インターバル専用)
時計用 (1本, 非RTC)
TAA (5本,TMP拡張版)
TAB (1〜3本,TMQ拡張版)
TMM (1本)
時計用 (1本)
TM0 (16bit, 78K互換)
TM5 (8bit,78K互換)
TMH (8bit,78K互換)
TMP (1本)
TMM (1本)
時計用 (1本)
内蔵RTC 一部の品種のみ × ×
64pin製品(速度,ROM/RAM) UPD70F3805〜3808
(20MHz, 16K〜128K/8K)
UPD70F3747
(32MHz, 128K/8K)
UPD70F3726
(20MHz, 128K/4K)
80pin製品 UPD70F3735
(20MHz, 128K/8K)
UPD70F3736
(20MHz, 256K/16K)
UPD70F3750
(32MHz, 256K/16K)
UPD70F3728
(20MHz, 128K/6K)
UPD70F3729
(20MHz, 256K/12K)
100pin製品 UPD70F3739〜3742
(32MHz, 384K〜1M/32K〜60K)
UPD70F3737,3738,3792,3793
(20MHz, 128K〜512K/8K〜40K)
UPD70F3752
(32MHz, 256K/16K)
UPD70F3731
(20MHz, 128K/6K)
UPD70F3732
(20MHz, 256K/16K)
144pin製品 UPD70F3743〜3746
(32MHz, 384K〜1M/32K〜60K)
UPD70F3755
(32MHz, 256K/16K)
UPD70F3755
(32MHz, 512K/32K)
UPD70F3733
(20MHz, 128K/6K)
UPD70F3734
(20MHz, 256K/16K)

 私としてはリセット回路やプルアップ・オプションの入っているV850ES/Hxシリーズを使いたいですが,入手性/将来性を考えると躊躇してしまいます。RXともぶつかりそうな感じなので,もう少し様子見ですかねぇ。
 とりあえずはJxでいいのかなぁ,でもリセットやプルアップ外付けは面倒だなぁ。周辺基板の3.3V対応も面倒だなぁ。
 ちなみに秋月の128x64ドットLCDは,スペックシートに手書きで2.7Vから動くと書いてありましたが,手持ちの品を試したところ3.0Vを切るとコントラストが取れなくなってしまいます。まぁ3.3Vでは一応のコントラストは取れているので問題無しです。
タイマの変遷
Jx2,Hx2世代のタイマTMPがJx3,Hx3世代ではタイマTAAに変わりつつあります。TAAでは32ビット・キャプチャが追加になって,その指定用のオプション・レジスタが追加されています。 しかし,ちょっとだけ機能アップした程度でレジスタ名称を全部変えるのは困るなぁ。使う側のソフト資産継承って考えてないのかなぁ。

V850_TIMER1.gif (9770 バイト)

 


●CA850(Cコンパイラ)

文字列リテラルでの日本語使用
 文字列リテラルで日本語を使うことは正式さポートされています。char型に格納するときは問題ないのですが,unsigned charに格納する場合はちょっと問題が出ます(W3.40)。
  unsigned char mojiA[100] = "これは問題無し";
  struct { unsigned char [100]; } mojiB = { "W2172ワーニングが出る" };
  int main(void) {
    unsigned unsigned char [100] mojiC = "W2172ワーニングが出る";
  }
いっそのこと,unsigned charでは全部ワーニング出てくれればすっきりするのですが,なまじ最初のケースだけワーニングが出ないので,悩んでしまいました。まぁ,まっとうにchar型使う人にはどーでもいい話ですが。
コンパイラ共通オプション
 デフォルトでは「ROM化」→「ROM化用オブジェクトの生成」にチェックが付いていませんが,付けておいた方がよいでしょう。理由については,後述の【最初の試練:W8735】を参照してください。
コンパイラ・オプション
V850ESでは,「出力コード」を次のように設定するのがよいと思います。
・「sconstセクションのデータ配置」→チェックをつけます。
・「レジスタ・モード」→26で良いでしょう。私が試してみた範囲(textセクション50KB)では,コード・サイズは32の時と僅差で,マスクレジスタ・オプション併用時は逆に26の方が小さくなりました。レスポンスも良くなるし,何かの時のためにレジスタに空きがあった方が安心できます。ちなみに22レジスタモードのコードは,32に比べて300バイトくらい大きくなりました。50KBに対して1%以下の差なので,”空きレジスタを増やしたい”と思ったら悩まず22を選択して良いでしょう。
・「マスク・レジスタの使用」→チェックをつけた方が良いでしょう。上記例では各レジスタモードとも300バイトぐらい減りました。ただしcharやshortの演算をあまり行わなければ必要無いかもしれません。
さらにデバッガでソース・デバッグの必要が無くなったら,「最適化とデバッグ情報」において最適化レベルを変更すると良いでしょう。上記例では「より高度な最適化(サイズ優先)」を行うと8.5KBもコードが減りました。
ROM化プロセッサ・オプションの設定
 W3.40では出力ファイル名を省略すると,マニュアル記載通りromp.outが出てきます。古いバージョンだと出てこなくて,何か名前を指定せねばならなかったです。
言語ヘルプが手抜き(雑談)
 CA850のC言語ヘルプにはCA850特有部分の解説しか無いので,一般的なCの構文とかはCC78K0Rのヘルプとか見てるんですよ。「32ビット・マイコンを使う人間にC言語初心者はいない」って前提なんでしょうかねぇ。

 


●CA850(スタートアップ・ルーチン)

スマートなスタートアップ・ルーチン&リンク・ディレクティブ】 2011/6/11 追加
 デフォルトのスタートアップ・ルーチンとリンクディレクティブには落とし穴があったり,外付けメモリを前提とした遺物が残っていて,一般的なV850ES利用者が使うのにはどうかなという気がします。
 そこで,今まで個別にごちゃごちゃと書いていたことをまとめて,スマートなスタートアップ・ルーチンとリンクディレクティブを作りました。実験中のドライバ・キットで動作確認してあります。ソフトウエア・サポートのページに掲載してあります。
最初の試練:W8735
 ツールをインストールして,プロジェクトを新規に作り,ビルドすると,初心者はまず
「W8735:インテル・ヘキサで表せるアドレスを超えてるよー」
というワーニングに悩まされるかもしれません(特に78K系に馴れたユーザははまると思う)。これは初期値を持つ静的変数(RAMに配置する変数)があると,CA850はその初期値を,そのRAMアドレス(64Mバイト空間の最後の方)でもってヘキサ出力しようとします。ところがインテル・ヘキサ(普通の拡張フォーマット)は1Mバイトまでしかアドレス指定できないので,アドレスが超えているというワーニングを出します。いやらしいことにデバッガではこの状態で動作しますが,HEXファイル書き込みすると初期値情報がコピーされないので動作しません(ただし対象がスタートアップ・ルーチンに含まれる初期値のある変数のみであって,mainに渡される引数を使用しないのであれば動作します)。
 CA850はCC78K系と違って,初期値のある静的変数を使うには,ROM化プロセッサを使わねばなりません。
 @「コンパイラ共通オプション」→「ROM化」→「ROM化用オブジェクトの生成」にチェックをつけます。
 A初期化ルーチンまたはmainの最初で,ROMコピールーチン(ヘルプのROM化プロセッサ参照)を呼び出す記述を追加します。
  例:
    int _rcopy(unsigned long *, long);
         extern unsigned long _S_romp;
        int main(void) {
             _rcopy(&_S_romp, -1);
        }
 CC78K系は何も意識しなくてもスタートアップ・ルーチンで静的変数に初期値を入れてくれました。CA850でもやってくれればよかったのに・・・。

 mainに引数を渡さないとか,初期値付き変数はRAMに配置しない(const修飾してROMに配置する),ということであれば,上記@だけの処置でもokです。しかし自分で明示的に使用しなくても一部のライブラリ関数では使用しているものがあり,”魔除け”として上記記述を入れておいた方が良いでしょう。

 なお,mainに引数を渡さないなら,下記のようにスターアップ・ルーチンの対象箇所をコメントアウトして初期値付き静的変数を削除してもよいです。
#-----------------------------------------------------------------------------
#    for argv
#-----------------------------------------------------------------------------
--    .data
--    .size    __argc, 4
--    .align    4
--__argc:
--    .word    0
--    .size    __argv, 4
--__argv:
--    .word    #.L16
--.L16:
--    .byte    0
--    .byte    0
--    .byte    0
--    .byte    0

および
--    ld.w    $__argc, r6         -- set argc
--    movea    $__argv, gp, r7         -- set argv
    jarl    _main, lp         -- call main function
レジスタ・モードの変更:W4608
 いったんデフォルトの32レジスタ・モードでプロジェクトを作成して,後で26または22レジスタ・モードに変更すると,
「W4608:レジスタ・モードの違うファイルが含まれてるよー」
というワーニングが出ます。スタートアップ・ルーチンのようなアセンブラ・ソースは,ソースの中でレジスタ・モードを指定しなければならないので,レジスタ・モードを変更する場合は,自分でソース先頭に記述を追加します。
例:26レジスタ・モードの場合  .option reg_mode 7 7
  22レジスタ・モードの場合  .option reg_mode 5 5
mainに引数を渡す場合
 引数の配置が.dataセクションになっていますが,普通は.sdataセクションに配置すればよいです。次の箇所を変更します。
#-----------------------------------------------------------------------------
#    for argv
#-----------------------------------------------------------------------------
    .data → .sdata
これによって,後ろで__argc, __argvを参照している命令が記述通りの1命令でコードが生成されます。
.dataのままだと,自動的に2命令に展開されてしまいます。つまりそれぞれ4バイト,計8バイトの増加になります(2命令展開については後述のアセンブラの所を参照)。

 


●CA850(リンク・ディレクティブ)

品種変更の処置
 プロジェクト作成時に指定した品種を変更する場合は,リンク・ディレクティブ(*.dir)のRAM領域指定も変更せねばなりません。もし品種が変わるごとに,いちいちリンク・ディレクティブを書き換えるのはいやじゃ,という人は次のようにします。
@リンク・ディレクティブのRAMアドレス指定を削除(2箇所)
   例:
  SIDATA : !LOAD ?RW V0x3ff7000 {    →   SIDATA : !LOAD ?RW {
    および
    DATA : !LOAD ?RW V0x3ff7100 {  → DATA : !LOAD ?RW {
  (注:DATAセグメントの記述はデフォルト通りSIDATAセグメントの後ろに記述してください。SIDATAは,RAM指定省略時は内蔵RAM先頭アドレスに配置されますが,DATAセグメントはROM/RAM関係なく直前のセグメントの続きに配置されます)
Aスタートアップ・ルーチンに.sibssセクションのダミー領域指定を追加
  場所はどこでも良いですが,デフォルトのスタートアップ・ルーチンには .sbssセクションのダミー領域指定の記述があるので,そこへ続けて書いておけばよいです(sbssの記述を2行コピぺしてsbssをsibssに書き換え)。
例:
    .sbss
    .lcomm    __sbss_dummy, 0, 0
    .sibss
    .lcomm    __sibss_dummy, 0, 0

 (注:この記述を書かなかった場合,他にSIDATAセグメントが1つもなければリンク・ディレクティブのSIDATAセグメント指定が無効になり,DATAセグメントがTEXTセグメント(ROM領域)の続きに配置されてしまいます)
盲腸の切除
 どーでも良いことなんで,真似する必要はありませんが,デフォルトのリンク・ディレクティブのGPシンボル指定がTEXTセグメントからの相対値で定義されているんですよね。V850ESにおいては盲腸のようなものなので切除しておいても良いでしょう。
@GPシンボル指定を絶対値に変更
  __gp_DATA @ %GP_SYMBOL &__tp_TEXT{DATA}; → __gp_DATA @ %GP_SYMBOL;
Aスタートアップ・ルーチンの次の行をコメントアウト
    add    tp, gp             -- set gp register  →  -- add     tp, gp             -- set gp register
これによって得られる効果は,ROM2バイトの削減(^^; と,ささやかな自己満足感(^^;
さらに,内蔵RAM60KB以内ならGPシンボル値は16bitになるので,次のように記述すればさらに2バイトの削減。
    mov  #__gp_DATA, gp        -- set gp register offset  → movea !__gp_DATA, r0, gp
さらにさらにスタックを.sbssセクションで定義すれば, __stackはGPシンボルからの16bit相対値で表せるので, 2バイトの削減。
   mov  #__stack+STACKSIZE, sp   --→  movea     $__stack+STACKSIZE, gp, sp
更なるせこい短縮
 内蔵ROMにプログラムを配置するならtpは0固定で良いので,TPシンボル指定はデフォルトのままにし,tpをゼロ・クリアします。
@デフォルトのTPシンボル指定はそのまま
 __tp_TEXT @ %TP_SYMBOL;    --→__tp_TEXTはゼロになります。 __tp_TEXT @ %TP_SYMBOL{TEXT};とすると直前のセクションの続きになってしまいます。心配なら次のようにアドレス指定も可能です。
 __tp_TEXT @ %TP_SYMBOL V0x0;
Aスタートアップ・ルーチンの次の行を書き換えます。これでまた4バイト縮みます。
    mov    #__tp_TEXT, tp         --→ mov  r0, tp
ただし,関数へのポインタを多用している場合で,すべての対象関数がtpから64KB以内に収まっている場合は,ポインタ値を16bitにしてtp加算することで多少コードを減らせます。ま,OSみたいなのをアセンブラでコーディングするときぐらいしか必要ないかもしれませんが。
TEXTセグメントをCONSTの前に移動する場合
 デフォルトではROM化プロセッサが初期化データをTEXTセグメントに追加するので,その分の領域を確保できるようにCONSTセグメントの開始アドレスを指定する必要があります。または,初期化データが配置されるセクションを指定します(指定方法はコンパイラのヘルプ参照)。
ちなみにTEXTをCONSTの前に移動したいってことは滅多に無いと思いますが,物理的64KB範囲の関数へのポインタ値を16ビットで保持したいような場合には使うかも。
Cコンパイラが吐き出すセクション
 通常は次のようになります。#pragma sectionで変更可能です。
.sconstセクション
「コンパイラ・オプション」→「出力コード」→「sconstセクションのデータ配置」にチェックをつけるとconst修飾した変数がここに配置されます。漢字フォントのような大きなテーブル以外は,ここに配置した方が効率が良いので,チェックをつけた方がよいです。
.constセクション
上記チェックしない場合にconst修飾した変数が配置されます。あるいは大きなテーブルだけsconstから除外したい場合,上記設定の中の「データ長の上限」を指定すると,それを超えるテーブルがここに配置されます。
.sdataセクション
const修飾のない初期値付き静的変数が配置されます。
.sbssセクション
初期値無し静的変数が配置されます。
.dataおよび.bssセクション
64Kバイト内に配置出来無かったconst修飾の無い静的変数が配置されます。内蔵RAMが64K内の品種においては生成されないはずです。もし意図してないのに出てくるようだと,アセンブラ・ソースあるいはライブラリのどこかで使っている可能性があります。アセンブラ・ソースを書き換えるか,ライブラリで指定されているセクション記述の指定方法を変更した方が良いでしょう。
”独自セクション名”
 配置を分けたり,アドレス指定するのために自分でセクション名を付けることが出来ます。ただし自由に付けられるのではなく,”独自に指定した名前.セクション属性”という名称になります。ややこしいのは#pragama sectionで指定するセクション種別は,sdata,data,sconst,constの4つだけで,sdata,dataについては初期値あり/無しによってセクション属性が sdata,sbss,data,bssに分かれる点です。
例:
#pragma section sdata "UNIQ_NAME" begin
char a[ ]="moji";    /* セクション名は UNIQ_NAME.sdata */
char b[100];        /* セクション名は UNIQ_NAME.sbss */
#pragma section sdata "UNIQ_NAME" end
当然リンク・ディレクティブには,これらの名前でセクション指定が必要です。
DATA : !LOAD ?RW V0x3ff5000 {
.data = $PROGBITS ?AW .data;
.sdata = $PROGBITS ?AWG .sdata;
UNIQ_NAME.sdata = $PROGBITS ?AWG UNIQ_NAME.sdata;
.sbss = $NOBITS ?AWG .sbss;
UNIQ_NAME.sbss = $NOBITS ?AWG UNIQ_NAME.sbss;
.bss = $NOBITS ?AW .bss;
};

 


●CA850(アセンブラ)

アセンブラ・ソースのデバッグ方法
 十分試したわけではありませんが,普通にアセンブラでソースを作るとMINICUBE2でステップ実行ができませんが,Cの関数として呼び出せばステップ実行が出来ました。まぁ,32bitマイコンでフルにアセンブラを使いたい人はめったに居ないかもしれませんが,部分的に使いたい人はいると思いますがねぇ,アセンブラ・ソース対応もきっちりやって欲しいなぁ。
2命令への自動展開
 CA850のアセンブラは頭がよすぎて,1命令で記述してもイミーディエト値が範囲外と判定すると勝手に2命令に展開してしまいます。たしかに変数の配置が.bss(32ビット空間)か.sbss(16ビット空間)か分からないような状況(RAM64K超える場合)ではソース変更無しで勝手に展開してくれた方が便利かもしれませんが,うっかりすると次のように意図しない展開が発生することがあります。
ソース記述:    andi  -0x100, r10, r10
アセンブル結果: movea 0xff00, zero, r1     -- (0xff00 = -0x100)
            and     r1, r10

自分ではandiと書いたのだから-0x100の下位16ビットである0xff00でandを取ってくれると思っていると,
アセンブラは,0xffffff00とandを取ると認識して32ビット値を生成してからandを取ってくれます。
もしマイナス表現(10進数でも同じ)を使いたければ,
 andi  -0x100 & 0xffff, r10, r10
のように書く必要があります。
 なお,addi -0x100, r10, r10 は1命令になります。同じ16ビット・イミ−ディエト値でもaddi命令の場合は符号拡張して加算,andiは0拡張してandを取ると言う違いがあるためです(機械語上の16ビット値0xff00は,addiでは0xffffff00,andiでは0x0000ff00と解釈される)。
割り込み内でのr1保存
 上記のように2命令自動展開ではr1が途中結果の保存に使われることが多いため,割り込みをアセンブラで記述するときはr1も忘れずに保存します。「俺は絶対2命令展開が起きないようにコーディングするから保存の必要はない!」という職人さんはお好きなように(^^;
配列を-32K以内に配置
 通常C言語で確保した変数はgp, epからの相対値で記述します(それぞれ$_変数名,%_変数名 と記述)。しかし配列a[b]をアクセスする場合は,a+(b<<n)+gpまたはepを計算せねばならず(nは型のサイズによる),やや手間がかかります。もし変数を-32K領域に配置できるなら,”!_変数名”で絶対値アクセスできるので,配列アクセスもb<<n→ri(riは適当なレジスタ)だけ計算すれば !_配列名[ri] で指定できます。内蔵RAMが28K以内の品種は自動的に変数は-32K領域に配置されますが,28Kを超える品種ではリンクディレクティブで-32K領域用のセクションを定義します。アセンブラの場合はセクション名は適当に付けられます。Cソース側でもアクセスする場合は,【Cコンパイラが吐き出すセクション】の”独自セクション名”の命名規則に準じます。

 


●資料室(マニュアル,ツールへのリンク)

最新資料についてはメーカのサイトで確認願います。(注)下記のPDF表示は「PDFダウンロード画面へのリンク」の意味です。IE11以上でないと当該ページが出ません

  〜〜〜 デバイスのマニュアル類 〜〜〜
 マイコンのデータシートは,最近ではユーザーズ・マニュアルと一緒になっています(以前はデータ・シートとユーザーズ・マニュアルは分かれていましたが)。電気的特性を見たい方は,ユーザーズ・マニュアルの後ろの方を見てください。

  〜〜〜 ターゲット・ボードのマニュアル類(価格はASMISネットショップ調べ) 〜〜〜 2012/9/15 追加
 
   注:MINICUBE2(10,500円)用をE1エミュレータ(12,600円)で使用する場合は,別売QB-F14T16-01(5,775円)が必要。

  〜〜〜 デバッグ・ボードのマニュアル、アダプタ図面、E1エミュレータ、プログラマ 〜〜〜

  〜〜〜 RTOS 〜〜〜 2016/12/30 追加

  〜〜〜 ツールのマニュアル類4 (CS+環境) 〜〜〜 2016/12/30 追加

  〜〜〜 ツールのマニュアル類1 (PM+環境) 〜〜〜

  〜〜〜 ツールのマニュアル類2 (CubeSuite環境) 〜〜〜 下記はCubeSuite+ではありません

  〜〜〜 ツールのマニュアル類3 (CubeSuite+(プラス)環境) 〜〜〜

  〜〜〜 関連ページへのリンク 〜〜〜


以前の更新
2016/12/30 [資料室]開発ツールの最新マニュアル等を追加。
2016/10/30 [資料室]リンク先全面修正(IE11以上必須)
2014/01/12 [資料室]ターゲットボードのマニュアルのリンク修正。
2013/10/02 [資料室]評価版ツールのプロダクトIDに関して追記。
2012/12/03 [資料室]デバイスファイルのリンク先変更。
2012/09/15 [資料室]ターゲットボードのマニュアルへのリンク追加。
2012/04/02 リンク修正完了(ルネサス旧URL閉鎖対応)。
2012/03/11 [ハードウエア]"コアのトレンド"を更新
2012/03/11 [資料室]にツールニュースへのリンクを追加
2012/01/25 リンク修正完了(ルネサス・ホームページ・リニューアル対応)。
2012/01/22 リンク修正(ルネサス・ホームページ・リニューアル対応)。
2011/11/27 [資料室] CubeSuite+ Ver1.01のマニュアルについて注記。
2011/07/30 [ツール総合]オブジェクト書込み時の注意を追加。
2011/07/06 [ツール総合]フリー・ツールの制限に関する更新。
2011/07/05 [ツール総合]フリー・ツールの制限に関する更新。
2011/07/03 [ツール総合]CubeSuite+に関する更新。
2011/06/20 [資料室]CubeSuite+に関するマニュアル追加。
2011/06/11 [CA850]”スマートなスタートアップ・ルーチンとリンク・ディレクティブ”を追加。
        [ツール総合]CXコンパイラに関する記述更新。
        [ハードウエア]”Jx3→Jx3−Hの違い”を追加。
2011/05/10  ページ内リンク追加。
2011/04/21 [ハードウエア]”乗算命令の不具合”を更新。
        [ツール総合]CA850 W3.46およびWindows7に関する更新。
2011/04/08 [ハードウエア]”回路設計の手引き”を追加。
2011/04/02 [資料室]V850ES/JG3-L ユーザーズ・マニュアルのリンクをR番号資料に修正。
2011/02/15 [ハードウエア]”Jx3→Hx3の違い”を更新。
2011/01/29 「ツール総合」を更新。[資料室]Cubesuite資料追加。
        {その他ページ全体にについて誤字訂正(Qube→Cube)}
2011/01/27 [ハードウエア]”Jx3→Hx3の違い”,”乗算命令の不具合”を更新。
2011/01/23 [ハードウエア]”Jx3→Hx3の違い”,”乗算命令の不具合”を追加。
2011/01/15 [資料室]簡易書き込み回路・ソフトへのリンク追加。
2011/01/05 [ハードウエア]”コアのトレンド”を追加。
・・・・略・・・・
2010/09/04 仮設