www.pudn.com > iccavrUCOS_m64.rar > test2.s
.module test2.c .area text(rom, con, rel) .even _t1Init:: ; ; #define Test1_GLOBALS ; #include "includes.h" ; ; //****************************************************************************** ; // Constants ; #define TaskStartPrio 10 // Task-Prioritaeten ; //***************************************************************************** ; // Variablen ; INT8U display[5]; ; INT8U h,m,s,state; ; OS_STK Task1Stack[OS_TASK_DEF_STK_SIZE]; // startup task stack ; OS_STK Task2Stack[OS_TASK_DEF_STK_SIZE]; ; //ICC-AVR application builder : 2003-12-28 21:52:56 ; // Target : M8 ; // Crystal: 8.0000Mhz ; ; #include; #include ; //#include ; #include "uart.h" ; ; //***************************************************************************** ; // Prototypes ; /* ; #define BAUD 9600 ; #define CRYSTAL 11059200 ; #define BAUD_SETTING (unsigned int)((unsigned long)CRYSTAL/(16*(unsigned long)BAUD)-1) ; #define BAUD_H (unsigned char)(BAUD_SETTING>>8) ; #define BAUD_L (unsigned char)(BAUD_SETTING) ; void uartInit(uint8 uartNum) ; { ; if(1==uartNum) ; { ; UCSR1B = 0x00; //disable while setting baud rate ; UCSR1A = 0x00; ; UCSR1C = 0x06; ; UBRR1L = BAUD_L; //set baud rate lo ; UBRR1H = BAUD_H; //set baud rate hi ; UCSR1B = 0x18; ; ///共有3个中断源, 接受, 发送, 寄存器空, 对应此寄存器的高3位 ; } ; else ; { ; UCSR0B = 0x00; //disable while setting baud rate ; UCSR0A = 0x00; ; UCSR0C = 0x06; //set frame format, 8 bits, 2stop] ; UBRR0H = BAUD_H; ; UBRR0L = BAUD_L; ; UCSR0B = 0x18; //enable receive and transmite ; ; } ; } ; void putChar(uint8 num, uint8 dat) ; { ; ENTER_CRITICAL(); ; if(1==num) ; { ; UDR1 = dat; ; while(!(UCSR1A&BIT(TXC1))); //发送寄存器空 ; UCSR1A|=BIT(TXC1); ; } ; else ; { ; UDR0 = dat; ; while(!(UCSR0A&BIT(TXC0))); ; UCSR0A|=BIT(TXC0); ; } ; EXIT_CRITICAL(); ; } ; */ ; //***************************************************************************** ; // TickISR ; //***************************************************************************** ; // WGM: 0) Normal, TOP=0xFFFF ; // desired value: 1Hz ; // actual value: Out of range ; void t1Init(void) ; { ; TCCR1B = 0x00; //stop clr R2 out 0x2e,R2 ; TCNT1H = 0x79; //setup ldi R24,121 out 0x2d,R24 ; TCNT1L = 0x02; ldi R24,2 out 0x2c,R24 ; OCR1AH = 0x00; out 0x2b,R2 ; OCR1AL = 0x00; out 0x2a,R2 ; OCR1BH = 0x00; out 0x29,R2 ; OCR1BL = 0x00; out 0x28,R2 ; OCR1CH = 0x00; sts 121,R2 ; OCR1CL = 0x00; sts 120,R2 ; ICR1H = 0x00; out 0x27,R2 ; ICR1L = 0x00; out 0x26,R2 ; TCCR1A = 0x00; out 0x2f,R2 ; TCCR1B = 0x02; //start Timer out 0x2e,R24 L2: .dbline 0 ; func end ret .area vector(rom, abs) .org 56 jmp _fuc .area text(rom, con, rel) .even _fuc:: xcall push_lset ; //时钟源选择 ; } ; ; //***************************************************************************** ; //8倍分频, 11.0592M晶振, 定时25ms ; //#pragma interrupt_handler OSTickISR:15 ; ; void OSTickISR(void); ; #pragma interrupt_handler fuc:15 ; void fuc() ; { ; TCNT1H = 0x79; ldi R24,121 out 0x2d,R24 ; TCNT1L = 0x00; clr R2 out 0x2c,R2 ; OSTickISR(); xcall _OSTickISR L3: xcall pop_lset .dbline 0 ; func end reti .even _init_devices:: ; } ; //call this routine to initialize all peripherals ; void init_devices(void) ; { ; //stop errant interrupts until set up ; CLI(); //disable all interrupts cli ; XDIV = 0x00; //xtal divider clr R2 out 0x3c,R2 ; XMCRA = 0x00; //external memory sts 109,R2 ; t1Init(); xcall _t1Init ; ; MCUCR = 0x00; clr R2 out 0x35,R2 ; EICRA = 0x00; //extended ext ints sts 106,R2 ; EICRB = 0x00; //extended ext ints out 0x3a,R2 ; EIMSK = 0x00; out 0x39,R2 ; TIMSK = 0x04; //timer interrupt sources ldi R24,4 out 0x37,R24 ; ETIMSK = 0x00; //extended timer interrupt sources sts 125,R2 L4: .dbline 0 ; func end ret .even _main:: sbiw R28,3 ; //SEI(); //re-enable interrupts ; } ; ; void Task1(void *pdata); ; void Task2(void *pdata); ; ; //***************************************************************************** ; // Start ; #define LED() PORTC = PORTC^BIT(4); ; void main(void){ ; PORTC=BIT(4); ldi R24,16 out 0x15,R24 ; DDRC=BIT(4); out 0x14,R24 ; LED(); in R2,0x15 eor R2,R24 out 0x15,R2 ; OSInit(); // OS init xcall _OSInit ; OSTaskCreate(Task1, ldi R24,7 std y+2,R24 ldi R24,<_Task1Stack+99 ldi R25,>_Task1Stack+99 std y+1,R25 std y+0,R24 clr R18 clr R19 ldi R16, PL_Task1 xcall _OSTaskCreate ; (void *)0, ; &Task1Stack[OS_TASK_DEF_STK_SIZE-1], ; 7); ; OSTaskCreate(Task2, ldi R24,6 std y+2,R24 ldi R24,<_Task2Stack+99 ldi R25,>_Task2Stack+99 std y+1,R25 std y+0,R24 clr R18 clr R19 ldi R16, PL_Task2 xcall _OSTaskCreate ; (void *)0, ; &Task2Stack[OS_TASK_DEF_STK_SIZE-1], ; 6); ; // init und start tick ; init_devices(); xcall _init_devices ; uartInit(1); ldi R16,1 xcall _uartInit ; OSStart(); // start multitasking xcall _OSStart L5: adiw R28,3 .dbline 0 ; func end ret ; data -> R10,R11 .even _Task1:: xcall push_gset3x movw R10,R16 ; ; } ; ; //***************************************************************************** ; void Task1(void *data) ; { ; SEI(); sei ; for (;;) L9: ; { ; LED(); ldi R24,16 in R2,0x15 eor R2,R24 out 0x15,R2 ; putStr(1, "task 1!\n\r"); ldi R18, L13 ldi R16,1 xcall _putStr ; OSTimeDly (20); ldi R16,20 ldi R17,0 xcall _OSTimeDly ; LED(); ldi R24,16 in R2,0x15 eor R2,R24 out 0x15,R2 ; OSTimeDly (20); ldi R16,20 ldi R17,0 xcall _OSTimeDly ; } xjmp L9 X0: L8: xcall pop_gset3x .dbline 0 ; func end ret ; data -> R10,R11 .even _Task2:: xcall push_gset3x movw R10,R16 ; ; } ; void Task2(void *data) ; { ; SEI(); sei ; for (;;) L15: ; { ; putStr(1, "task 2!\n\r"); ldi R18, L19 ldi R16,1 xcall _putStr ; OSTimeDly (80); ldi R16,80 ldi R17,0 xcall _OSTimeDly ; } xjmp L15 X1: L14: xcall pop_gset3x .dbline 0 ; func end ret .area bss(ram, con, rel) _Task2Stack:: .blkb 100 _Task1Stack:: .blkb 100 _state:: .blkb 1 _s:: .blkb 1 _m:: .blkb 1 _h:: .blkb 1 _display:: .blkb 5 .area data(ram, con, rel) L19: .blkb 10 .area idata .byte 't,'a,'s,'k,32,50,33,10,13,0 .area data(ram, con, rel) L13: .blkb 10 .area idata .byte 't,'a,'s,'k,32,49,33,10,13,0 .area data(ram, con, rel) .area func_lit PL_Task2: .word `_Task2 PL_Task1: .word `_Task1