para rodar duas funçoes no mcu.
simples exemplo, usei um SH32, mas, pode ser qquer outro.
void TI1_Init(void);
void init_dualtask(void);
void _task_main(void);
void f1(void);
void f2(void);
uint straks_0 @0x000000FE;
uint temp_stk,tsk0,tsk1;
uchar cr_tasks,z,y;
//------------------------------
void main(void) {
init_dualtask();
EnableInterrupts;
TI1_Init();
for(;;) {
z++;
}
}
}
//-------------------------------------------------------
void _task_main(void){
for(;;) {
y++;
}
}
//-------------------------------------
void interrupt 13 isr_TPM2C1SC_CH1F(void) //timer = 10uS,20uS....
{
TPM2C1SC_CH1F =0;
asm{
TSX
STHX temp_stk; // pilha atual salva
}
cr_tasks ^=0x1;
if( 0x01 & cr_tasks){ // 1= _task_main ,0 = main
asm{ // carrega _task_main
LDHX tsk1; // load pilha anterior
TXS
LDHX temp_stk;
STHX tsk0; // salva atual
}
}else{
asm{ // carrega main
LDHX tsk0; // load pilha anterior
TXS
LDHX temp_stk;
STHX tsk1; // salva atual
}
}
}
//-------------------------------------------------------
void init_dualtask( void ){
void (*p) ();
asm{ // so para sumulador...
lda #$10
ldhx #$FF
cl: clr ,x
aix #-1
deca
bne cl
}
p = _task_main; // salva endereço da funçao2
straks_0 = (int) (*p);
cr_tasks= 0;
tsk1 = 0xFA; // Topo da pilha2 FF-5
asm{
TSX // salva pilha main
AIX #-9
STHX tsk0;
}
}
//---------------------------------------------------------
void TI1_Init(void) {
SOPT1 = 0x23;
SOPT2 = 0x3;
TPM2SC= 0x00;
TPM2C1SC= 0x50;
TPM2MOD = 0xEF;
TPM2CNTH= 0x00;
TPM2SC = 0x08;
}
//---------------------------------------------------------