ucos IIでのユーザカスタム割り込み関数の追加

8537 ワード

ucosでは,システムの脈拍として1つのタイマ割り込みに依存するだけでなく,ユーザがカスタマイズした割り込みを追加する必要がある場合が多いが,ここでは外部割り込みを例に,フレンドリーな2440のプレートを用いたテストを行う.事前にucosに慣れていないため、呼び出しメカニズムを理解するのに3日間かかりました.メモとして書いておくのも参考になります.
    1.まず自分の割り込みを初期化し、例えば割り込み可能にする、割り込み優先度を設定するなど、簡単な例で、1つのボタンで外部割り込み0を出発し、外部割り込み0の処理関数の中でテストプロセスにpost 1つのメッセージを送り、そのプロセスはメッセージを受け取ってから勝手に1行の文字を印刷する.まずレジスタを初期化して、中断できるようにして、大体コードを入れます:
     
void CPU_Init()
{
//0000 0000 1010 0010 1010 1010 1010 1010 1010
/ b.c CON
// rGPGCON = 0xff95ffba;
// rGPGUP = 0xffff; // The pull up function is disabled GPG[15:0]
// 8 , ( );
testcount=0;
rGPGCON=(rGPGCON & ~3)| 2; // GPGCON0
rEXTINT1=(rEXTINT1 & ~7)| 2; //

rEINTPEND =(1<<8); // 8 append
rSRCPND =(1<<5); // EINT8——23
rINTPND =(1<<5); //

// HandleEINT8_23=(uint32)KeyBoard_INT;
pISR_EINT8_23=(U32)HandleEINT8_23; //


rEINTMASK =rEINTMASK & ~(1<<8); // 8
rINTMSK =rINTMSK &~(1<<5); // EINT8_23
Uart_SendString("InterInit Finished!");
}

2.ここではocosでの割り込みの実現メカニズム(個人的理解)について説明する.2440のバージョンでは、Os_cpu_a.sには2440 initが見られる.sの割り込みベクトル番号:
;Don''t use the label 'IntVectorTable',
;The value of IntVectorTable is different with the address you think it may be.
;IntVectorTable
;@0x33FF_FF20
HandleEINT0 # 4
HandleEINT1 # 4
HandleEINT2 # 4
HandleEINT3 # 4
HandleEINT4_7 # 4
HandleEINT8_23 # 4
HandleCAM # 4 ; Added for 2440.
HandleBATFLT # 4
HandleTICK # 4
HandleWDT # 4
HandleTIMER0 # 4
HandleTIMER1 # 4
HandleTIMER2 # 4
HandleTIMER3 # 4
HandleTIMER4 # 4
HandleUART2 # 4
;@0x33FF_FF60
HandleLCD # 4
HandleDMA0 # 4
HandleDMA1 # 4
HandleDMA2 # 4
HandleDMA3 # 4
HandleMMC # 4
HandleSPI0 # 4
HandleUART1 # 4
HandleNFCON # 4 ; Added for 2440.
HandleUSBD # 4
HandleUSBH # 4
HandleIIC # 4
HandleUART0 # 4
HandleSPI1 # 4
HandleRTC # 4
HandleADC # 4
;@0x33FF_FFA0
END

この部分は、各割り込み関数の割り込みベクトルテーブルであり、割り込みが到来すると、割り込みに基づいてベクトルテーブルのoffsetで特定の割り込み処理関数にジャンプする.
それから自分の割り込み処理関数を書き始め、関数名と与えられたハンドル名が同じであることに注意します(ただし、ポインタで値を付けることもできると思います).
void HandleEINT8_23(void) 
{
//EnterCritical(&r);
OS_CPU_SR cpu_sr;
OS_ENTER_CRITICAL();
OSIntNesting++;
OS_EXIT_CRITICAL();

if(rINTPND==BIT_EINT8_23) {
ClearPending(BIT_EINT8_23);
if(rEINTPEND&(1<<8)) {
rEINTPEND |= 1<< 8;
OSMboxPost(Keyboard_Box,(void *)&msg); //
}
}

OSIntExit();
// ExitCritical(&r);

// OS_ENTER_CRITICAL(); /* Update the 32-bit tick counter */

// OS_EXIT_CRITICAL();

// char msg='A';
// Uart_SendString("Enter Task3
");ing("In the Inter!");
// rEINTPEND =(1<<8);
// rSRCPND=(1<<5);
// rINTPND=(1<<5);
//
}

割り込みハンドラの流れにはこだわりがあり、intnesting++を最後にOSINTExit()を呼び出す必要があります.
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3513293&bbs_page_no=1&search_mode=4&search_text=mcu520&bbs_id=9999
見えます.
3.次のテストは、新しいTaskを作成し、mailが来るのを待つことにほかならない.これはucosの内容であり、ここでは後述しない.
転載先:https://www.cnblogs.com/biyeqingfeng/archive/2012/03/12/2392309.html