C2A_Core
task_dispatcher.c
[詳解]
1 #pragma section REPRO
8 #include "task_dispatcher.h"
9 
10 #include <stdlib.h>
11 #include <string.h> // for memcpy
12 
13 #include "../../TlmCmd/packet_list_util.h"
14 #include "../../TlmCmd/block_command_executor.h"
15 #include "../../TlmCmd/common_cmd_packet_util.h"
16 #include "../ModeManager/mode_manager.h"
17 #include "../TimeManager/time_manager.h"
18 #include "../TimeManager/obc_time_config.h"
19 #include "../EventManager/event_logger.h"
22 
23 #define TDSP_TASK_MAX BCT_MAX_CMD_NUM
24 
27 
28 // 現在のサイクルで実行すべきタスク一覧を保存したもの
30 
35 static void TDSP_deploy_block_as_task_list_(void);
36 
37 // debug_apps にあるべき & 今はつわかないので無効化
38 #if 0
39 #include "../../Library/print.h"
40 #include <src_user/Library/vt100.h>
44 static void TDSP_print_tdsp_status_(void);
45 #endif
46 
47 
48 void TDSP_initialize(void)
49 {
50  static PL_Node task_stock_[TDSP_TASK_MAX];
51  static CommonCmdPacket packet_stock_[TDSP_TASK_MAX];
52  PL_initialize_with_ccp(task_stock_, packet_stock_, TDSP_TASK_MAX, &TDSP_task_list_);
53 
54  // タスクリストを初期化し、INITIALモードのブロックコマンドを展開する
59 }
60 
61 
63 {
64  if (id >= BCT_MAX_BLOCKS) return TDSP_INVAILD_BCT_ID;
65  if (!BCE_is_active(id)) return TDSP_INACTIVE_BCT_ID;
66  if (BCT_get_bc_length(id) == 0) return TDSP_EMPTY_BC;
67 
69  return TDSP_SUCCESS;
70 }
71 
72 
74 {
75  PL_ACK ack;
76 
77  // 本関数内の処理中にMaster Cycleが変化した場合を検出できるよう、
78  // まず次Master Cycleの情報を更新する。
80 
82 
83  if (ack != PL_SUCCESS)
84  {
88  (uint32_t)ack);
89  }
90 }
91 
92 
94 {
95  // まずは (1)ブロックコマンドがタスクリストに展開された時のサイクル数 と (2)現在のサイクル数 を比較
96  // (1) = (2) の時は展開から 1サイクル (100ms) 以内なのでタスクリストに登録されたコマンドを一つ実行する
97  // (1) > (2) の時は今回のサイクルで実行すべきコマンドがすべて実行済みである
98  // (1) < (2) の時は展開から 1サイクル (100ms) 以上経過してしまっているので強制終了する
99 
101  {
102  // タスクリストの先頭コマンド実行予定時刻と現在時刻を比較
104  (size_t)(TMGR_get_master_step()));
105 
106  switch (ack)
107  {
108  case PL_TLC_PAST_TIME:
109  // 実行時刻が過ぎていた場合は実行前にアノマリを登録。
113  (uint32_t)CCP_get_ti( (const CommonCmdPacket*)(PL_get_head(&TDSP_task_list_)->packet) ));
114 
115  // FALL THROUGH
116 
117  case PL_TLC_ON_TIME:
118  // 実行時刻が過ぎている、もしくは実行時刻ピッタリの場合はコマンドを実行
120 
122  {
123  // コマンド実行時に異常が発生した場合はアノマリを登録。
128  }
129 
130  break;
131 
132  case PL_TLC_NOT_YET:
133  // case名が不適切だが、ここに来るのは以下の二つの場合
134  // ・タスクリストが空
135  // ・次のコマンドの実行時刻がまだ
136 
138  {
139  // task_listが空なら再度タスクリストを展開
140  // これを行うとtask_dispatcher_.activated_atがインクリメントされるので、"次のサイクル実行待ち状態"になる
142  }
143 
144  break;
145 
146  default:
147  // 基本ここには来ない
149  TDSP_UNKNOWN,
151  (uint32_t)ack);
152  }
153  }
155  {
156  // 次のサイクルの実行待ち状態
157  return;
158  }
160  {
162  {
163  // 次サイクルの実行待ち状態(サイクルオーバーフロー直前)
164  // 本来は task_dispatcher_.activated_at > TMGR_get_master_total_cycle() となるはずが、
165  // task_dispatcher_.activated_atがあふれて0に戻っている場合ここに来る
166  return;
167  }
168  else
169  {
170  // 1サイクル以内に全てのコマンドを実行し終えなかった場合ここに来る
174  0);
175 
176  // リストをクリア->再展開し次サイクルから再実行
179  }
180  }
181 }
182 
183 
185 {
187 }
188 
189 
191 {
192  // FIXME: u8 でいいのか? まあ,いい気もする.
194 
195  switch (ack)
196  {
197  case TDSP_SUCCESS:
199  case TDSP_INVAILD_BCT_ID:
202  case TDSP_EMPTY_BC:
203  default:
205  }
206 }
207 
208 
209 // debug_apps にあるべき & 今はつわかないので無効化
210 #if 0
211 AppInfo TDSP_print_tdsp_status(void)
212 {
213  return AI_create_app_info("tstm", NULL, TDSP_print_tdsp_status_);
214 }
215 
216 
217 void TDSP_print_tdsp_status_(void)
218 {
220  Printf("TASK: BC %d, ERR (TOTAL, STEP, STS, CODE) = (%10u, %3u, %d, %d)\n",
226 }
227 #endif
228 
229 #pragma section
AppInfo AI_create_app_info(const char *name, void(*initializer)(void), void(*entry_point)(void))
AppInfo を作る
Definition: app_info.c:9
ブロックコマンド定義
uint8_t BCE_is_active(const bct_id_t block)
BCT の length の getter
uint8_t BCT_get_bc_length(const bct_id_t block)
BCT の length の getter
#define BCT_MAX_BLOCKS
BCのIDの最大数
uint16_t bct_id_t
コマンド定義
CommandDispatcher CDIS_init(PacketList *pl)
CDIS の初期化と取得
void CDIS_dispatch_command(CommandDispatcher *cdis)
CDIS に登録されているコマンドキューからコマンドを実行
@ CCP_EXEC_SUCCESS
@ CCP_EXEC_ILLEGAL_PARAMETER
コマンド実行時のパラメタエラー
@ CCP_EXEC_ILLEGAL_CONTEXT
コマンド実行時のその他のエラー
const uint8_t * CCP_get_param_head(const CommonCmdPacket *packet)
先頭のパラメタのポインタを取得
cycle_t CCP_get_ti(const CommonCmdPacket *packet)
TI を取得
CCP_CmdRet CCP_make_cmd_ret_without_err_code(CCP_EXEC_STS exec_sts)
コマンド返り値である CCP_CmdRet を作成(エラーコード不使用版)
EL_ACK EL_record_event(EL_GROUP group, uint32_t local, EL_ERROR_LEVEL err_level, uint32_t note)
イベント (EL_Event) を記録
Definition: event_logger.c:269
@ EL_CORE_GROUP_TASK_DISPATCHER
Definition: event_logger.h:209
@ EL_ERROR_LEVEL_HIGH
Definition: event_logger.h:262
@ EL_ERROR_LEVEL_LOW
Definition: event_logger.h:266
EL_GROUP
event_logger の Event Group の user 定義部分
@ MD_MODEID_START_UP
bct_id_t MM_get_tasklist_id_of_mode(MD_MODEID mode)
mode に対応した TL の BCT ID を取得する
Definition: mode_manager.c:330
#define OBCT_MAX_CYCLE
最大 cycle 数.つまり TI がいくつでオーバーフローするか
void PL_clear_list(PacketList *pl)
PacketList をクリア
Definition: packet_list.c:69
PL_ACK PL_check_tl_cmd(const PacketList *pl, cycle_t time)
PacketList の先頭と time を比較
Definition: packet_list.c:397
const PL_Node * PL_get_head(const PacketList *pl)
PacketList の active な先頭 Node を取得
Definition: packet_list.c:150
PL_ACK PL_deploy_block_cmd(PacketList *pl, const bct_id_t block, cycle_t start_at)
PacketList 上に BC を展開する
Definition: packet_list.c:340
uint16_t PL_count_active_nodes(const PacketList *pl)
PacketList で有効な(実行待ち) Node 数を返す
Definition: packet_list.c:104
PL_ACK
PacketList 関連操作のエラーコード
Definition: packet_list.h:39
@ PL_TLC_NOT_YET
まだ実行時刻ではない
Definition: packet_list.h:47
@ PL_TLC_PAST_TIME
実行時間既に経過
Definition: packet_list.h:44
@ PL_SUCCESS
成功
Definition: packet_list.h:40
@ PL_TLC_ON_TIME
実行時刻丁度
Definition: packet_list.h:46
PL_ACK PL_initialize_with_ccp(PL_Node *pl_node_stock, CommonCmdPacket *packet_stock, uint16_t node_num, PacketList *pl)
static に確保された PL_Node 配列と CCP 配列を受け取りその領域を使用して PL を初期化
void Printf(const char *format,...)
Definition: print.c:9
コマンド返り値
uint32_t err_code
各 Cmd ユニークなエラーコード.各 App で定義する enum などを入れることを想定.
CCP_EXEC_STS exec_sts
CCP_EXEC_STS.Cmd の統一的なエラーコード
CCP_CmdRet cmd_ret
実行結果
ObcTime time
実行時刻
Space Packet (コマンド用)
CDIS_ExecInfo prev_err
最後にエラーが出たコマンド実行情報
CDIS_ExecInfo prev
前回のコマンド実行情報
cycle_t total_cycle
TI のこと. OBC が起動してから(正確には,構造体が初期化されてから)の経過時間
Definition: obc_time.h:19
step_t step
内部 step. TimeLine での処理時間分割に使われる
Definition: obc_time.h:21
片方向リストを構成する各 Node
Definition: packet_list.h:59
パケットリスト本体
Definition: packet_list.h:73
TaskDispatcherの状態
bct_id_t task_list_id
タスクリストに展開するブロックコマンドのID
CommandDispatcher tskd
タスクリストへのポインタと、その他実行情報を保存する構造体
cycle_t activated_at
ブロックコマンドがタスクリストに展開された時のサイクル数
void TDSP_resync_internal_counter(void)
タスクリストの展開時サイクル数を現在のサイクル数に強制的に合わせる
#define TDSP_TASK_MAX
static PacketList TDSP_task_list_
static void TDSP_deploy_block_as_task_list_(void)
task_dispatcher_.task_list_id に登録された BC を TaskListに展開.
void TDSP_initialize(void)
タスク管理を行うTaskDsipatcher構造体(TaskDsipatcher_)の初期化
void TDSP_execute_pl_as_task_list(void)
現在時刻に応じて、TaskList から Cmd を一つ実行する or TaskList を再展開する
TDSP_ACK TDSP_set_task_list_id(bct_id_t id)
指定した BC を TaskList に展開するものとして登録
const TaskDsipatcher *const task_dispatcher
CCP_CmdRet Cmd_TDSP_SET_TASK_LIST(const CommonCmdPacket *packet)
指定したブロックコマンドを、次にタスクリストに展開するものとして登録するコマンド
static TaskDsipatcher task_dispatcher_
task list に設定されたタスクを実行する主体
TDSP_ACK
TDSPのエラーステータス
@ TDSP_STEP_OVERRUN
コマンドが実行予定のステップ数を過ぎている
@ TDSP_DEPLOY_FAILED
ブロックコマンドのタスクリストへの展開時にエラーが発生
@ TDSP_TASK_EXEC_FAILED
コマンド実行時にエラーが発生
@ TDSP_UNKNOWN
@ TDSP_CYCLE_OVERRUN
1サイクル以内にすべてのコマンドを実行し終えなかった
@ TDSP_SUCCESS
@ TDSP_INVAILD_BCT_ID
実行する BCT_ID が無効だった
@ TDSP_INACTIVE_BCT_ID
実行する BCT_ID が無効化されている
@ TDSP_EMPTY_BC
実行する BC が空だった
cycle_t TMGR_get_master_total_cycle(void)
現在の total_cycle を返す
Definition: time_manager.c:97
step_t TMGR_get_master_step(void)
現在の step を返す
Definition: time_manager.c:105
void VT100_erase_line(void)
Definition: vt100.c:31