Forums: Help (Thread #3735)

助けてー(x_x) (2003-11-09 21:45 by rosk_t #6568)

こんばんわ。

HOSを久々に触るたびにはまりまくってるようなきがします(x_x)。またちょっと力を貸してください。

sh/7047のCPUボードでHOSを動かそうとしてるのですが、system.cfgで定義したタスクが起動されないと言う問題にあたりました。しらべて見ると、act_tsk()の返り値がE_NOEXSになっていることを突き止めました。なぜこうなるかわからないので、とりあえずコンフィグレータが作るkernel_cfg.cとact_tsk()の処理を追いかけて、アドレスの比較などをしてみました。するとなぜか&kernel_tcb_ram[0]とkernel_tcb_ram_tbl[0]が等しくならずに、&kernel_tcb_ram[2]とkernel_tcb_ram_tbl[0]が等しくなってしまいます(どうもずれているらしい)(x_x)

kernel_cfg.cを見る限り、代入しているのだからそんなことはありえないと思うのですが…どなたか見当のつく方いらっしゃいませんか?環境はcygwin5.0上のgcc-3.3です。

ちょっと長いですが、関係しそうなソースをつけます。よろしくおねがいします。

---
main.c
---
#include <stdio.h>
#include <stdlib.h>
#include "kernel.h"
#include "kernel_id.h"
#include "user_id.h"
#include "main.h"
#include "ioboard.h"
#include "sci.h"
#include "packet.h"
#include "ostimer.h"

int
main (void)
{
// ハードウェアの初期化
iob_init ();

// sci_init (br38400);
// os_timer_init (6000);

/* HOS-V4 の開始 */
sta_hos();

return 0;
}

/* ATT_INI 登録の関数 */
void
main_initialize(VP_INT exinf)
{
#if 1
extern T_KERNEL_TCB_RAM *kernel_tcb_ram_tbl[16];
extern T_KERNEL_TCB_RAM kernel_tcb_ram[3];

/* 同じにならないはずだが、なってしまう… */
if (&kernel_tcb_ram[2] == kernel_tcb_ram_tbl[0]) {
iob_led_set (0, 1);
}
#endif
#if 0 /* E_NOEXSが返ってくる */
if (E_OK != act_tsk(1)) {
iob_led_set (0, 1);
}
#endif
}

---
system.cfg
---
#include "user_id.h"


HOS_KERNEL_HEAP(4096); /* カーネルヒープの設定(省略時 0) */
HOS_TIM_TIC(1, 1); /* タイムティックの設定(省略時 1/1 ) */
HOS_MAX_TPRI(16); /* 最大優先度(省略時 16) */
HOS_MIN_INTNO(0); /* 割り込み番号の最小値(省略時 0) */
HOS_MAX_INTNO(256); /* 割り込み番号の最大値(省略時 0) */
HOS_MAX_TSKID(16); /* 最大タスクID番号(省略時静的生成に必要なだけ) */

/* インクルードファイルの指定 */
INCLUDE("\"user_id.h\"");
INCLUDE("\"main.h\"");
INCLUDE("\"test.h\"");
INCLUDE("\"7047.h\"");
//INCLUDE("\"ostimer.h\"");

#define SH_INTNUM_CMI0 144
#define SH_INTNUM_CMI1 148

/* OSタイマ用 */
ATT_ISR({TA_HLNG, 0, SH_INTNUM_CMI0, os_timer_handler});
ATT_INI({TA_HLNG, 30720 - 1, os_timer_init});

/* タスク生成 */
CRE_TSK (1, {TA_HLNG, 1, task_test, 1, 3000, NULL});
CRE_TSK (2, {TA_HLNG, 1, task_test, 1, 3000, NULL});
CRE_TSK (3, {TA_HLNG, 1, task_test, 1, 3000, NULL});

ATT_INI({TA_HLNG, 0, main_initialize});

---
kernel_cfg.c
---
/* ------------------------------------------------------------------------ */
/* HOS-V4 kernel configuration */
/* kernel object create and initialize */
/* */
/* ------------------------------------------------------------------------ */


#include "kernel.h"
#include "kernel_id.h"

#include "user_id.h"
#include "main.h"
#include "test.h"
#include "7047.h"



/* ------------------------------------------ */
/* idle stack */
/* ------------------------------------------ */

VP mknl_idl_stkblk[((128) + sizeof(VP) - 1) / sizeof(VP)]; /* idle stack block*/
const VP mknl_idl_stk = (VP)(mknl_idl_stkblk); /* idle stack */
const SIZE mknl_idl_stksz = (SIZE)sizeof(mknl_idl_stkblk); /* idle stack size */



/* ------------------------------------------ */
/* create ready queue */
/* ------------------------------------------ */

T_MKNL_QUE mknl_rdq_tbl[16];
const INT mknl_rdq_cnt = 16;



/* ------------------------------------------ */
/* kernel heap */
/* ------------------------------------------ */

VP kernel_heap_mem[((4096) + sizeof(VP) - 1) / sizeof(VP)]; /* kernel heap */



/* ------------------------------------------ */
/* set time tic */
/* ------------------------------------------ */

const UW kernel_tic_deno = TIC_DENO;
const UW kernel_tic_div = TIC_NUME / TIC_DENO;
const UW kernel_tic_mod = TIC_NUME % TIC_DENO;



/* ------------------------------------------ */
/* create task objects */
/* ------------------------------------------ */

/* stack area */
static VP kernel_tsk1_stk[((3000) + sizeof(VP) - 1) / sizeof(VP)];
static VP kernel_tsk2_stk[((3000) + sizeof(VP) - 1) / sizeof(VP)];
static VP kernel_tsk3_stk[((3000) + sizeof(VP) - 1) / sizeof(VP)];

/* task control block for rom area */
const T_KERNEL_TCB_ROM kernel_tcb_rom[3] =
{
{(ATR)(TA_HLNG), (VP_INT)(1), (FP)(task_test), (PRI)(1), (SIZE)(3000), (VP)kernel_tsk1_stk},
{(ATR)(TA_HLNG), (VP_INT)(1), (FP)(task_test), (PRI)(1), (SIZE)(3000), (VP)kernel_tsk2_stk},
{(ATR)(TA_HLNG), (VP_INT)(1), (FP)(task_test), (PRI)(1), (SIZE)(3000), (VP)kernel_tsk3_stk},
};

/* task control block for ram area */
T_KERNEL_TCB_RAM kernel_tcb_ram[3];

/* task control block table */
T_KERNEL_TCB_RAM *kernel_tcb_ram_tbl[16] =
{
&kernel_tcb_ram[0],
&kernel_tcb_ram[1],
&kernel_tcb_ram[2],
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
};

/* task control block count */
const INT kernel_tcb_cnt = 16;



/* ------------------------------------------ */
/* create semaphore objects */
/* ------------------------------------------ */

/* semaphore control block count */
const INT kernel_semcb_cnt = 0;



/* ------------------------------------------ */
/* create event flag objects */
/* ------------------------------------------ */

/* event flag control block count */
const INT kernel_flgcb_cnt = 0;



/* ------------------------------------------ */
/* create data queue objects */
/* ------------------------------------------ */

/* data queue control block count */
const INT kernel_dtqcb_cnt = 0;



/* ------------------------------------------ */
/* create mail box objects */
/* ------------------------------------------ */

/* mail box control block count */
const INT kernel_mbxcb_cnt = 0;



/* ------------------------------------------ */
/* create message buffer objects */
/* ------------------------------------------ */

/* mail box control block count */
const INT kernel_mbfcb_cnt = 0;



/* ------------------------------------------ */
/* create fixed size memory-pool objects */
/* ------------------------------------------ */

/* fixed size memory-pool control block count */
const INT kernel_mpfcb_cnt = 0;



/* ------------------------------------------ */
/* create cyclic handler objects */
/* ------------------------------------------ */

/* cyclic handler control block count */
const INT kernel_cyccb_cnt = 0;



/* ------------------------------------------ */
/* create alarm handler objects */
/* ------------------------------------------ */

/* alarm handler control block count */
const INT kernel_almcb_cnt = 0;



/* ------------------------------------------ */
/* interrupt control objects */
/* ------------------------------------------ */

/* interrupt control */
T_KERNEL_INTCB kernel_intcb_tbl[257]; /* interrupt control block table */
const INT kernel_intcb_cnt = 257; /* interrupt control block count */
const INTNO kernel_min_intno = 0; /* minimum intrrupt number */

/* interrupt service routine control */
const INT kernel_isrcb_cnt = 0; /* ISR control block count */



/* ------------------------------------------ */
/* CPU exception handler control objects */
/* ------------------------------------------ */

/* interrupt control */
T_KERNEL_EXCCB kernel_exccb_tbl[1]; /* CPU exception handler control block table */
const INT kernel_exccb_cnt = 1; /* CPU exception handler control block count */
const EXCNO kernel_min_excno = 0; /* minimum CPU exception handler number */



/* ------------------------------------------ */
/* initialize functions */
/* ------------------------------------------ */

/* object initialize */
void kernel_cfg_init(void)
{
int i;


/* initialize task control block */
for ( i = 0; i < 3; i++ )
{
kernel_tcb_ram[i].tcb_rom = &kernel_tcb_rom[i];
}

/* initialize interrupt table */
kernel_intcb_tbl[144].exinf = (VP_INT)(0);
kernel_intcb_tbl[144].isr = (FP)(os_timer_handler);
}

/* start up */
void kernel_cfg_start(void)
{
kernel_ini_mem(kernel_heap_mem, sizeof(kernel_heap_mem)); /* initialize kernel heap */

kernel_ini_tsk(); /* initialize task */

/* call initialize routine*/
((FP)(os_timer_init))((VP_INT)(30720 - 1));
((FP)(main_initialize))((VP_INT)(0));
}


/* ------------------------------------------------------------------------ */
/* End of file */
/* ------------------------------------------------------------------------ */

---
btc070-ram.x
---
OUTPUT_FORMAT("coff-sh")
OUTPUT_ARCH(sh)
MEMORY
{
/* 内蔵ROM 0x00000000~0x0003ffff */
/* 外部RAM 0x00200000~0x00280000 */
/* 内蔵I/O 0xffff8000~0xffffbfff */
/* 内蔵RAM 0xffffd000~0xffffffff */
vectors : o = 0x00200000, l = 0x00000400
ram : o = 0x00200400, l = 256k-0x400
stack : o = 0x0021fff0, l = 0x10
}
SECTIONS
{
.vector :
{
_VECTOR_START = . ;
*(.vector)
_VECTOR_END = . ;
} > vectors
.text :
{
_TEXT_START = . ;
*(.text)
*(.strings)
_TEXT_END = . ;
_etext = . ;
} > ram
.data : AT (ADDR(.text) + SIZEOF(.text))
{
_DATA_START = . ;
*(.data)
_DATA_END = . ;
_edata = . ;
} > ram
.rodata : {
*(.rodata)
_erodata = .;
} > ram
.bss :
{
_bss = . ;
_bss_start = . ;
_BSS_START = . ;
*(.bss)
*(COMMON)
_BSS_END = . ;
_ebss = . ;
_end = . ;
} > ram
.stack :
{
_STACK_START = . ;
*(.stack);
_STACK_END = . ;
} > stack
}

Reply to #6568×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: 助けてー(x_x) (2003-11-09 22:28 by m-arai #6569)

これは変数の初期値の問題のようなので、疑うとすれば
リンカスクリプトとスタートアップ(crt0.s)になるかと
思います。

取り敢えず、
>.data : AT (ADDR(.text) + SIZEOF(.text))
ram上での実行のようですから、AT指定を削除、スタート
アップから.data領域の初期値ロードの部分を外してみて
はいかがでしょう。

また、リンカが吐くマップファイルを見て、どこに何が
出力されているのかを確認してみるのも問題解決に役立つ
かもしれません。
Reply to #6568

Reply to #6569×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: 助けてー(x_x)(タスク配列の初期値がずれる) (2003-11-09 23:15 by rosk_t #6570)

m-araiさん、すばやいレスありがとうございます。
しかも…ビンゴです。

.data : AT (ADDR(.text) + SIZEOF(.text))


.data :

とすると、何の問題もなく動き出しました\(^_^)

二つの.mapファイルをdiffとってみると,,,

< .data 0x0000000000201eb0 0x40 load address 0x0000000000201eb0
---
> .data 0x0000000000201eb0 0x40

上がNGなほう、下がOKな方です。

…よくわかりませんが、ロードするアドレスを指定はせずに、かってに詰めさせたほうがいいということですかね…

ありがとうございました!かなり感動。
Reply to #6569

Reply to #6570×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login