(toppers-users 4133) TOPPERS/SSPのリンクエラーについて(Re: Re: SSP(cq_starm_gcc版)で不具合と思われる修正を行いました)

Naoki Saito nsaito.nmiri @ gmail.com
2013年 9月 20日 (金) 09:58:05 JST


斉藤です.
お世話になっております.

> kernel_cfg.o: In function `_kernel_initialize_object':
> C:\devel\TOPPERS\work\ssp_gcc\ssp\OBJ_APL/kernel_cfg.c:260: undefined
reference to `_kernel_initialize_eventflag'
> C:\devel\TOPPERS\work\ssp_gcc\ssp\OBJ_APL/kernel_cfg.c:261: undefined
reference to `_kernel_initialize_dataqueue'
(以下,略)

イベントフラグやデータキューついては 1.2.0 からの追加となります.
従いまして,1.1.1からファイルをコピーする際に,どの範囲のファイルをコピーされたのかが
気になります.

>
小生、マイコンで動作させるc言語の記述部はどうにでも対応しますが、タスクの数は増やすにはコンフィギュレータの修正が必要ですね。こちらは少々敷居が高いのです(努力中ではあります)。

テンプレートファイル(.tf)を編集したりするのは慣れが必要かもしれませんね.
どのような出力が欲しいのか仰っていただければテンプレートファイルの一例を
お示しする程度であればできるかなと思います.

以上です.

2013年9月19日 21:17 koizumi yoshiyuki <koizumiyoshiyuki @ gmail.com>:

> 斎藤さま
>
> 返信ありがとうございます。
>
> 1.の件ですが申し訳ありません。私は勘違いをしていました。
> main_task では 0(TASK1), 1(TASK2), 2(TASK3) の値をとりますが,
> task では 1(TASK1),2(TASK2), 3(TASK3) の値を取る.
>
> で了解です。混乱は135行にありそうです。
> **org
> void main_task(intptr_t exinf)
> {
> static ID tskid = TASK1;
> static uint_t tskno = 1;
> **update
> void main_task(intptr_t exinf)
> {
> static ID tskid = TASK1;
> static uint_t tskno = 0;
>  <−説明によると初期値は0なのでしょうか、main_taskのtasknoをtaskと同じにした方がよさそうな気がします。
>
>
> 10.の件ですが、小生はBuildに失敗しています。リンクで以下のエラーになります。
>
> arm-none-eabi-gcc  -mcpu=cortex-m3 -mthumb  -g -Wall -Os  -DROM_BOOT
> -DTOPPERS_LABEL_ASM -I. -I../include -I../arch -I..
>   -I../target/cq_starm_gcc -I../arch/arm_m_gcc/ -nostdlib -nostdlib   -T
> ../target/cq_starm_gcc/cq_starm_rom.ld -o ssp.e
> xe  \
>                  sample1.o     banner.o serial.o vasyslog.o syslog.o
> log_output.o logtask.o kernel_cfg.o    ../KERNEL_LI
> B/libkernel.a   -lgcc
> kernel_cfg.o: In function `_kernel_initialize_object':
> C:\devel\TOPPERS\work\ssp_gcc\ssp\OBJ_APL/kernel_cfg.c:260: undefined
> reference to `_kernel_initialize_eventflag'
> C:\devel\TOPPERS\work\ssp_gcc\ssp\OBJ_APL/kernel_cfg.c:261: undefined
> reference to `_kernel_initialize_dataqueue'
> sample1.o: In function `task':
> C:\devel\TOPPERS\work\ssp_gcc\ssp\OBJ_APL/sample1.c:215: undefined
> reference to `set_flg'
> C:\devel\TOPPERS\work\ssp_gcc\ssp\OBJ_APL/sample1.c:220: undefined
> reference to `clr_flg'
> C:\devel\TOPPERS\work\ssp_gcc\ssp\OBJ_APL/sample1.c:224: undefined
> reference to `pol_flg'
> C:\devel\TOPPERS\work\ssp_gcc\ssp\OBJ_APL/sample1.c:228: undefined
> reference to `psnd_dtq'
> C:\devel\TOPPERS\work\ssp_gcc\ssp\OBJ_APL/sample1.c:232: undefined
> reference to `prcv_dtq'
> collect2.exe: error: ld returned 1 exit status
> Makefile:309: recipe for target `ssp.exe' failed
> make: *** [ssp.exe] Error 1
>
> C:\devel\TOPPERS\work\ssp_gcc\ssp\OBJ_APL>
>
>  buildのコマンド実行手順
> ライブラリ作成時
> >cd KERNEL_LIB
> >perl ../configure -T cq_starm_gcc -f
> >make depend
> >make libkernel.a
>
> アプリ作成時
> >cd
> >perl ../configure -T cq_starm_gcc -L ../KERNEL_LIB
> >make
>
> ライブラリ作成時のAR実行ログ
> arm-none-eabi-ar -rcs libkernel.a  target_support.o  prc_support.o
>  target_config.o target_serial.o prc_config.o prc_tim
> er.o sta_ker.o ext_ker.o tskini.o get_ipri.o get_ipriself.o tsksched.o
>  tskact.o tskrun.o tskdsp.o tskdmt.o act_tsk.o ia
> ct_tsk.o intini.o dis_int.o ena_int.o excini.o loc_cpu.o iloc_cpu.o
> unl_cpu.o iunl_cpu.o dis_dsp.o ena_dsp.o  sns_ctx.o
> sns_loc.o sns_dsp.o sns_dpn.o sns_ker.o cycini.o sta_cyc.o stp_cyc.o
> cyccal.o almini.o sta_alm.o stp_alm.o almcal.o get_
> tim.o tmevtini.o tmevtenq.o tmevtdeq.o sig_tim.o eventflag.o dataqueue.o
> arm-none-eabi-ranlib libkernel.a
>
> extensionのオブジェクトはibkernel.a含まれていないですね。
>
>
> 小生、マイコンで動作させるc言語の記述部はどうにでも対応しますが、タスクの数は増やすにはコンフィギュレータの修正が必要ですね。こちらは少々敷居が高いのです(努力中ではあります)。
>
> よろしくお願いします。
>
> 以上
>
>
> 2013年9月19日 16:11 Naoki Saito <nsaito.nmiri @ gmail.com>:
>
>> 斉藤です.
>> お世話になっております.
>>
>> 可能な範囲でお答えします.
>>
>> 基本的に 1.1.1 の問題点などは後のバージョンの方で対応していたり
>> しますので,可能であればそちらをお使いいただければと考えております.
>> (逆に1.1.1を使いたい理由がもしあれば参考までにお聞きできるとありがたいです)
>>
>> 1.
>> main_task と task とで tskno の取る値の範囲が異なるようですね.
>> main_task では 0(TASK1), 1(TASK2), 2(TASK3) の値をとりますが,
>> task では 1(TASK1),2(TASK2), 3(TASK3) の値を取る.
>> ところが,main_task ではtskid=TASK1, tskno=1 に初期化されるため
>> '1', '2', '3' を一度も入力しない状態では 'e' がTASK1に渡らない,
>> ということになっているのではないかと思います.
>>
>> ですので,現状だと task 内で行っている -1 は必要ではないでしょうか.
>> それより main_task の tskno を 0 に初期化すればよいと思います.
>> そもそも tskno の使い方のズレを直したほうがよいかもしれません.
>>
>> 2,4,7
>> これらについては次期リリースにて対応予定です.
>>
>>>> これは仰るとおりですね.6に戻す方向で
>> 次期リリースにて対応させていただきます.
>>
>> 3,6
>> M3依存部は担当範囲外ですが,仰る対応で問題無いかと思います.
>>
>> 10
>> extension のモジュールは libkernel.a にリンクされているという認識ですが,
>> 問題有りますでしょうか?
>>
>> 最後に最大タスク数の問題について,申し訳ありませんが
>> 今のところ既定値を変更する予定はありません.
>> ご要望が多ければ検討いたしますが...
>> おそらく変更は難しくないと思いますので独自に対応をお願いしたいと思います.
>>
>> 以上,よろしくお願いします.
>>
>>
>>
>> 2013年9月19日 9:57 koizumi yoshiyuki <koizumiyoshiyuki @ gmail.com>:
>>
>>> こいさんです
>>>
>>> SSPの1.2.0が公開(ssp-1.2.0.tar.gz)されたので、sq_strm
>>> 1.1.1(ssp_cq_starm_gcc-20120607.tar)の
>>> arch\arm_m_gccとtarget\cq_starm_gccをコピーして実行しました。この際気になった問題(?)の修正を(ワーニングを含む)行ったので報告します。
>>>
>>> -------------------------------------------
>>>
>>> 1 eコマンドが動作しない(共通部)
>>>
>>> ssp\sample\sample1.cの205,206行のmessage[tskno - 1]の -1 は不要のはず。
>>>
>>> main_task()にて tskno=0の時、taskのアクセスがmessage[tskno - 1]だと問題あり?
>>>
>>> **org
>>>
>>> command = message[tskno - 1];
>>>
>>> message[tskno - 1] = 0;
>>>
>>> **update
>>>
>>> command = message[tskno];
>>>
>>> message[tskno] = 0;
>>>
>>> 修正後sample1は以下のように動作するようになりました。
>>>
>>>
>>> TOPPERS/SSP Kernel 1.2.0  for CQ-STARM(STM32F103) (Sep 18 2013 ,
>>> 20:26:04)
>>>
>>> Copyright (C) 2010 by Meika Sugimoto
>>>
>>> Copyright (C) 2010 by Naoki Saito
>>>
>>>             Nagoya Municipal Industrial Research Institute, JAPAN
>>>
>>>
>>> Sample program starts. <− aコマンド タスクは1が出来フォルトなのでタスク1が起動
>>>
>>> #act_tsk(1)
>>>
>>> task1 is running (001).   | <−aコマンド 起動キューを有効
>>>
>>> #act_tsk(1)
>>>
>>> task1 is running (002).   |
>>>
>>> task1 is running (003).   |
>>>
>>> task1 is running (004).   | <−eコマンド タスクを停止、起動がキューされているので再起動
>>>
>>> #1#terminate task
>>>
>>> task1 is running (005).   | <−eコマンド タスクを停止
>>>
>>> #1#terminate task
>>>
>>> この件は使用も絡むので私の認識誤りかもしれません。
>>>
>>>
>>> 2 kernel_cfg.cのワーニング(共通部)
>>>
>>> _kernel_flginib_iflgptnの初期値が9桁あり、8桁が正しい。
>>>
>>> ssp\sample\sample1.cfgの25行目の0x100000000が誤り。0を1つ削除でよさそう。
>>>
>>> **org
>>>
>>> CRE_FLG(FLG1 , { TA_NULL , 0x100000000 });
>>>
>>> **update
>>>
>>> CRE_FLG(FLG1 , { TA_NULL , 0x10000000 });
>>>
>>>
>>>  3 serial.cのワーニング(共通部)
>>>
>>> ssp\syssvc\serial.cの478行のbuffer_emptyは使われていない。
>>>
>>> 削除した(すべきかは解らず)。
>>>
>>>
>>>  4 dataqueue.cのワーニング(共通部)
>>>
>>> ssp\extension\dataqueue.cの84,164行のconst sizeにuint8_t 追加
>>>
>>> 記述もれ(誤り)だと思う。(cy8c版は修正されている)
>>>
>>> **org
>>>
>>> dequeue_data(intptr_t* const data , uint8_t* const head , const size ,
>>> intptr_t* rdata);
>>>
>>> **update
>>>
>>> dequeue_data(intptr_t* const data , uint8_t* const head , uint8_t const
>>> size , intptr_t* rdata);
>>>
>>>
>>>  5 t_syslog.hのワーニング(共通部)
>>>
>>> 110行、loginfo[5]のアクセスがあるが、TMAX_LOGINFOは4になっている、6が正しい。
>>>
>>> 216行のsyslog.loginfo[5] = arg6; でメモリの不正アクセスになる。記述誤りだと思う。
>>>
>>> **org
>>>
>>> #define TMAX_LOGINFO 4
>>>
>>> **update
>>>
>>> #define TMAX_LOGINFO 6
>>>
>>>
>>>  TMAX_LOGINFOの値を条件に関数の有効無効を切り替えるのが使い易いと思うが。#ifは好まれないみたいですね。
>>>
>>>
>>> 6 prc_timer.cのワーニング(CM3専用)
>>>
>>> 102行、フラグクリアの為、レジスタ読出し値は使用しない。
>>>
>>> tmpを削除すべきではないか。
>>>
>>>
>>>  7 prc_insn.hのワーニング(CM3専用)
>>>
>>> 61行、istkにchar_t *のキャストが必要だと思う。
>>>
>>> **org
>>>
>>> #define TOPPERS_ISTKPT(istk, istksz) ((STK_T *)((istk) + (istksz)))
>>>
>>> **update
>>>
>>> #define TOPPERS_ISTKPT(istk, istksz) ((STK_T *)((char_t *)(istk) +
>>> (istksz)))
>>>
>>>
>>>  397行、void *の加算になっている。カッコを入れるべき。
>>>
>>> **org
>>>
>>> sil_wrw_mem((void *)NVIC_CLRENA0 + (tmp >> 5), (1 << (tmp & 0x1f)));
>>>
>>>
>>>  sil_wrw_mem((void *)(NVIC_CLRENA0 + (tmp >> 5)), (1 << (tmp & 0x1f)));
>>>
>>>
>>>  8 target_config.cのワーニング(CM3専用)
>>>
>>> set_port_pull()は未使用なので削除すべきか。
>>>
>>>
>>>  9 sample1.cとselial.cで同じ名前のマクロ(SVC)が使われている
>>>
>>> 問題なく動作しているが、良いサンプルソースと言えないと思う。
>>>
>>> また、selial.cではSVCはワーニングになっている。
>>>
>>> 別なマクロ名にすべきだと思う。
>>>
>>>
>>>  10 アプリケーションとカーネルを別々に構築出来ていない(未解決)
>>>
>>> extension
>>> 部はライブラリになるべきだと思うが、オブジェクトがライブラリに入っていない。コンパイルスイッチでオブジェクトを分ける処理も必要だと思ている。
>>>
>>> -------------------------------------------
>>>
>>>
>>> 10については何かコメントが頂けることを願っています。
>>>
>>>  追伸
>>>
>>> 起動処理のキュー機能が追加され嬉しく思っています。SSPの最大タスク数は16に制限されていますが32bitワンチップマイコンが増えている昨今、最大タスク数を16から32に増す案は如何でしょうか。タスク数が増えても、増やしたタスク分のメモリを別にすればタスク番号<->bitイメージ変換が変わるだけなのでメモリサイズへの影響は少ないと思っています。タスク数の増加に伴う誤りは100%チェックされる(増やしたタスクの起動確認)はずでしょう。
>>> タスク番号<->bitイメージ変換命令を持つCPUでは性能もメモリサイズも性能も変わらないでしょう。
>>>
>>> 以上
>>>
>>
>>
>
-------------- next part --------------
HTMLの添付ファイルを保管しました...
URL: <http://www.toppers.jp/pipermail/users/attachments/20130920/16dd6a51/attachment.html>