mirror of
https://github.com/rvtr/ctr_mcu.git
synced 2025-10-31 13:51:10 -04:00
全ファイルをindentに通した ほか、たくさん修正 git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-05-23%20-%20ctr.7z%20+%20svn_v1.068.zip/ctr/svn/ctr_mcu@12 013db118-44a6-b54f-8bf7-843cb86687b1
343 lines
7.5 KiB
C
343 lines
7.5 KiB
C
#pragma section @@CODE ROM_CODE
|
||
#pragma nop
|
||
#pragma ei
|
||
#pragma di
|
||
#pragma sfr
|
||
|
||
/******************************************************************************
|
||
タスクシステム?
|
||
なるほど、iTRONにはコンフィギュレータがあるはずだ。
|
||
→作りました
|
||
ctr_mcu_config.rb 参照。 task_config.hが作成されます。
|
||
*****************************************************************************/
|
||
#include "renge_defs.h"
|
||
#include "renge_task_intval.h"
|
||
#include "renge_task_immediate.h"
|
||
|
||
|
||
#include "..\WDT.h"
|
||
|
||
|
||
//******************************************************************************
|
||
bit renge_flg_interval;
|
||
bit renge_task_interval_run_force;
|
||
|
||
extern const task_info tasks[];
|
||
|
||
#include "..\bsr_system.h"
|
||
extern system_status_ system_status;
|
||
|
||
|
||
//******************************************************************************
|
||
static void renge_task_immed_init();
|
||
static void renge_task_immed_del( u8 );
|
||
|
||
/******************************************************************************
|
||
初期化。
|
||
・タスクシステムの動的部分の初期化
|
||
・インターバルタイマ
|
||
*****************************************************************************/
|
||
void renge_init(){
|
||
renge_task_immed_init();
|
||
/*
|
||
イベントタイマのセットなど
|
||
今回はRTCを流用しているのでコメントアウト
|
||
#define renge_tick 19xxxxxxx [ms]
|
||
renge_interval_init(); → RTC_init();
|
||
*/
|
||
}
|
||
|
||
|
||
|
||
/******************************************************************************
|
||
システムチックを進める
|
||
*****************************************************************************/
|
||
/*
|
||
void renge_interval(){
|
||
// RTCがやってくれる
|
||
→__interrupt void int_rtc_int();
|
||
}
|
||
*/
|
||
|
||
|
||
|
||
/******************************************************************************
|
||
コンパイル時に決まっている、インターバル起動のタスク
|
||
そのうち、逐次起動と混ぜるかもしれない。
|
||
*****************************************************************************/
|
||
err renge_task_interval_run(){
|
||
task_info *current_task;
|
||
|
||
// インターバル起動
|
||
if( renge_flg_interval == 1 ){
|
||
renge_flg_interval = 0;
|
||
for( current_task = &tasks[0];
|
||
current_task != &tasks[TSK_LAST];
|
||
current_task += 1 )
|
||
{
|
||
current_task -> task();
|
||
}
|
||
}
|
||
return( ERR_SUCCESS );
|
||
}
|
||
|
||
|
||
|
||
/*****************************************************************************
|
||
■逐一起動タスク■
|
||
|
||
●task_immed を返す関数。
|
||
●システムtick、何らかの割り込み(I2C通信完了など)で
|
||
スリープから復帰したタイミングで実行されます。
|
||
|
||
■返値 ERR_FINISED タスクを削除
|
||
それ以外 次のタイミングでまた実行
|
||
|
||
*****************************************************************************/
|
||
#define IMMED_RSV_TASKS_NUM 15
|
||
task_immed tasks_immed[ IMMED_RSV_TASKS_NUM ]; // タスクへのポインタの配列
|
||
u8 task_immed_index = 0;
|
||
|
||
|
||
|
||
/**************************************
|
||
**************************************/
|
||
void renge_task_immed_init(){
|
||
/*
|
||
グローバルなメモリはスタートアップルーチンで
|
||
0に初期化されてるので。
|
||
*/
|
||
u8 i;
|
||
|
||
for( i = 0; i < IMMED_RSV_TASKS_NUM; i++ ){
|
||
tasks_immed[ i ] = (void *)0;
|
||
}
|
||
task_immed_index = 0;
|
||
}
|
||
|
||
|
||
|
||
/**************************************
|
||
**************************************/
|
||
err renge_task_immed_add( task_immed new_task ){
|
||
static u8 lock = 0;
|
||
|
||
DI();
|
||
if( lock != 0 ){
|
||
while(1){
|
||
NOP();
|
||
}
|
||
}
|
||
lock = 1;
|
||
|
||
// 最終的にはチェック不要になる
|
||
/// 手動でタスクの数を数えなさい、という意味ですが。
|
||
if( task_immed_index >= IMMED_RSV_TASKS_NUM ){
|
||
// タスクの登録領域が足りなかった
|
||
while(1){
|
||
NOP(); // アサートで止めたいのですが。
|
||
}
|
||
lock = 0;
|
||
EI();
|
||
return( ERR_ERR );
|
||
|
||
}else{
|
||
|
||
// 同じタスクの多重登録を避ける
|
||
{
|
||
u8 temp;
|
||
for( temp = 0; temp < task_immed_index; temp += 1 ){
|
||
if( tasks_immed[ temp ] == new_task ){
|
||
// while(1){
|
||
NOP(); // アサートで止めたいのですが。
|
||
// }
|
||
lock = 0;
|
||
EI();
|
||
return( ERR_ERR );
|
||
}
|
||
}
|
||
}
|
||
|
||
#if 0
|
||
// 登録した領域はすでに使用済みだった(管理に不整合)
|
||
if( tasks_immed[ task_immed_index ] != 0 ){
|
||
while(1){
|
||
NOP();
|
||
}
|
||
}
|
||
|
||
// タスク追加
|
||
tasks_immed[ task_immed_index ] = new_task;
|
||
// タスクリストの最後に追加するはずなのに、最後じゃなかった
|
||
if( tasks_immed[ task_immed_index+1 ] != 0 ){
|
||
while(1){
|
||
NOP();
|
||
}
|
||
}
|
||
// tasks_immed[ task_immed_index+1 ] = 0;
|
||
#endif
|
||
|
||
// タスク登録
|
||
{
|
||
u8 i;
|
||
for( i = 0; i < IMMED_RSV_TASKS_NUM; i += 1 ){
|
||
if( tasks_immed[ i ] == 0 ){
|
||
tasks_immed[ i ] = new_task;
|
||
break;
|
||
}
|
||
}
|
||
task_immed_index += 1;
|
||
}
|
||
|
||
// タスクリストの整合性チェック
|
||
{
|
||
u8 j;
|
||
u8 k = 0;
|
||
for( j = 0; j < ( IMMED_RSV_TASKS_NUM -1); j += 1 ){
|
||
if( tasks_immed[ j ] != 0 ){
|
||
k += 1;
|
||
}
|
||
}
|
||
if( k != task_immed_index ){
|
||
while(1){
|
||
NOP();
|
||
}
|
||
}
|
||
}
|
||
|
||
lock = 0;
|
||
EI();
|
||
return( ERR_SUCCESS );
|
||
}
|
||
while(1){
|
||
NOP();
|
||
}
|
||
}
|
||
|
||
|
||
|
||
/**************************************
|
||
**************************************/
|
||
static void renge_task_immed_del( u8 task_id ){
|
||
u8 i;
|
||
|
||
// 指定タスクの削除と、リスト前詰め
|
||
for( i = task_id;
|
||
(( tasks_immed[ i ] != (void*)0 ) && ( i < IMMED_RSV_TASKS_NUM ));
|
||
i += 1 ){
|
||
tasks_immed[ i ] = tasks_immed[ i+1 ];
|
||
}
|
||
task_immed_index -= 1;
|
||
|
||
#if 0
|
||
// 整合性チェック
|
||
{
|
||
u8 j;
|
||
u8 k = 0;
|
||
for( j = 0; j < ( IMMED_RSV_TASKS_NUM -1); j += 1 ){
|
||
if( tasks_immed[ j ] != 0 ){
|
||
k += 1;
|
||
}
|
||
}
|
||
while( k != task_immed_index ){
|
||
NOP();
|
||
}
|
||
}
|
||
#endif
|
||
|
||
}
|
||
|
||
|
||
|
||
/**************************************
|
||
**************************************/
|
||
err renge_task_immed_run(){
|
||
u8 task_id;
|
||
u8 i;
|
||
|
||
do{
|
||
i = 0;
|
||
|
||
for( task_id = 0; task_id < IMMED_RSV_TASKS_NUM; task_id += 1 ){
|
||
if( tasks_immed[ task_id ] != 0 ){
|
||
if( tasks_immed[ task_id ]() == ERR_FINISED ){
|
||
// トラップ
|
||
if( system_status.pwr_state == OFF_TRIG ){
|
||
u8 i = 0;
|
||
while( i == 0 ){
|
||
NOP();
|
||
}
|
||
}
|
||
DI();
|
||
renge_task_immed_del( task_id );
|
||
EI();
|
||
}
|
||
}
|
||
}
|
||
|
||
for( task_id = 0; task_id < IMMED_RSV_TASKS_NUM; task_id += 1 ){
|
||
if( tasks_immed[ task_id ] != 0 ){
|
||
i += 1;
|
||
}
|
||
}
|
||
|
||
}while( i != 0 );
|
||
|
||
|
||
|
||
#if 0
|
||
for( task_id = 0; task_id < IMMED_RSV_TASKS_NUM; task_id += 1 ){
|
||
if( tasks_immed[ task_id ] == 0 ){
|
||
break;
|
||
}
|
||
if( tasks_immed[ task_id ]() == ERR_FINISED ){
|
||
DI();
|
||
renge_task_immed_del( task_id );
|
||
EI();
|
||
}
|
||
}
|
||
// 整合性チェック
|
||
{
|
||
u8 j;
|
||
u8 k = 0;
|
||
for( j = 0; j < ( IMMED_RSV_TASKS_NUM -1); j += 1 ){
|
||
if( tasks_immed[ j ] != 0 ){
|
||
k += 1;
|
||
}
|
||
}
|
||
if( k != task_immed_index ){
|
||
while(1){
|
||
NOP();
|
||
}
|
||
}
|
||
}
|
||
#endif
|
||
|
||
return( ERR_SUCCESS );
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
/******************************************************************************
|
||
単位は ms
|
||
NOPを回すだけ、指定時間CPUを占有します。
|
||
割り込みとか入るとその分遅れます。
|
||
少し誤差あります。
|
||
*****************************************************************************/
|
||
void wait_ms( u8 ms ){
|
||
u16 fine;
|
||
|
||
WDT_Restart();
|
||
// まだ適当です!
|
||
while( ms != 0 ){
|
||
ms--;
|
||
fine = 430;
|
||
while( fine != 0 ){
|
||
fine -= 1;
|
||
}
|
||
}
|
||
}
|
||
|