?? os_cpu_c.c
字號:
/*
********************************************************************************
* uC/OS-II
* The Real-Time Kernel
*
* ATmega103 Specific code
*
* File: OS_CPU_C.C
* By: Ole Saether
* Modified by: Joerg Meyer
* Revision: 0
*
*
*
********************************************************************************
*/
#define OS_CPU_GLOBALS
#include "includes.h"
/*
********************************************************************************
* INITIALIZE A TASK'S STACK
*
* Description:
* This function is called by either OSTaskCreate() or OSTaskCreateExt() to
* initialize the stack frame of the task being created. This function is
* highly processor specific.
*
* Arguments:
* task - is a pointer to the task code
*
* pdata - is a pointer to a user supplied data area that will be passed to the
* task when the task first executes.
*
* ptos - is a pointer to the top of stack. It is assumed that 'ptos' points to
* the highest valid address on the stack.
*
* opt - specifies options that can be used to alter the behavior of
OSTaskStkInit(). (see uCOS_II.H for OS_TASK_OPT_???).
*
* Returns:
* Always returns the location of the new top-of-stack' once the processor
* registers have been placed on the stack in the proper order.
*
* Note(s):
* Interrupts are enabled when your task starts executing. You can change this
* by setting the SREG to 0x00 instead. In this case, interrupts would be
* disabled upon task startup. The application code would be responsible for
* enabling interrupts at the beginning of the task code. You will need to
* modify OSTaskIdle() and OSTaskStat() so that they enable interrupts. Failure
* to do this will make your system crash! The AVR return stack is placed 64
* bytes above the start of the (512 byte) stack. This provides 32 levels of
* function call nesting which should be more than enough for most applications
* (see the "read.me" file for more info).
*
********************************************************************************
*/
OS_STK *OSTaskStkInit (void (*task)(void *pd),
void *pdata, OS_STK *ptos, INT16U opt){
INT8U *stk;
INT8U *stks; // Temp. variable used for setting up AVR hardware stack
INT16U tmp;
opt = opt; // 'opt' is not used, prevent warning
stk = (INT8U *)ptos; // Wandlung von ptos in Bytezeiger
// AVR return stack ("hardware stack")
stks = (INT8U *)(ptos)-(OS_TASK_DEF_STK_SIZE-32);
// the function address has an extra level of indirection. Fetch the
// actual address.
//
tmp = *(INT16U const *)task;
// 36 Bytes
*stks-- = (INT8U)tmp; //Put task start address on top of hardware stack
*stks-- = (INT8U)(tmp >> 8);
*stk-- = (INT8U)0x00; // R0 = 0x00
*stk-- = (INT8U)0x01;
*stk-- = (INT8U)0x02;
*stk-- = (INT8U)0x03;
*stk-- = (INT8U)0x04;
*stk-- = (INT8U)0x05;
*stk-- = (INT8U)0x06;
*stk-- = (INT8U)0x07;
*stk-- = (INT8U)0x08;
*stk-- = (INT8U)0x09;
*stk-- = (INT8U)0x10;
*stk-- = (INT8U)0x11;
*stk-- = (INT8U)0x12;
*stk-- = (INT8U)0x13;
*stk-- = (INT8U)0x14;
*stk-- = (INT8U)0x15;
tmp = (INT16U)pdata;
*stk-- = (INT8U)tmp; //Simulate call to function with argument
*stk-- = (INT8U)(tmp >> 8);
*stk-- = (INT8U)0x18;
*stk-- = (INT8U)0x19;
*stk-- = (INT8U)0x20;
*stk-- = (INT8U)0x21;
*stk-- = (INT8U)0x22;
*stk-- = (INT8U)0x23;
*stk-- = (INT8U)0x24;
*stk-- = (INT8U)0x25;
*stk-- = (INT8U)0x26;
*stk-- = (INT8U)0x27;
// the heap pointer Y=R29:R28 will not be stored
*stk-- = (INT8U)0x30;
*stk-- = (INT8U)0x31;
*stk-- = (INT8U)0x3B;
*stk-- = (INT8U)0x80; //SREG = Interrupts enabled
tmp = (INT16U)(stks);
*stk-- = (INT8U)(tmp >> 8);
*stk = (INT8U)(tmp);
return ((void *)stk);
}
#if OS_CPU_HOOKS_EN
/*
********************************************************************************
* TASK CREATION HOOK
*
* Description: This function is called when a task is created.
*
* Arguments:
* ptcb is a pointer to the task control block of the task being created.
*
* Note(s): 1) Interrupts are disabled during this call.
********************************************************************************
*/
void OSTaskCreateHook (OS_TCB *ptcb)
{
ptcb = ptcb; // Prevent compiler warning
}
/*
********************************************************************************
* TASK DELETION HOOK
*
* Description: This function is called when a task is deleted.
*
* Arguments:
* ptcb is a pointer to the task control block of the task being deleted.
*
* Note(s): 1) Interrupts are disabled during this call.
********************************************************************************
*/
void OSTaskDelHook (OS_TCB *ptcb)
{
ptcb = ptcb; // Prevent compiler warning
}
/*
********************************************************************************
* TASK SWITCH HOOK
*
* Description:
* This function is called when a task switch is performed. This allows you to
* perform other operations during a context switch.
*
* Arguments: none
*
* Note(s):
* 1) Interrupts are disabled during this call.
* 2) It is assumed that the global pointer 'OSTCBHighRdy' points to the TCB
* of the task that will be 'switched in' (i.e. the highest priority task)
* and, 'OSTCBCur' points to the task being switched out (i.e. the
* preempted task).
********************************************************************************
*/
void OSTaskSwHook (void)
{
}
/*
********************************************************************************
* STATISTIC TASK HOOK
*
* Description:
* This function is called every second by uC/OS-II's statistics task. This
* allows your application to add functionality to the statistics task.
*
* Arguments: none
********************************************************************************
*/
void OSTaskStatHook (void)
{
}
/*
********************************************************************************
* TICK HOOK
*
* Description: This function is called every tick.
*
* Arguments : none
*
* Note(s) : 1) Interrupts may or may not be ENABLED during this call.
********************************************************************************
*/
void OSTimeTickHook (void)
{
}
#endif
//*****************************************************************************
// TickISR
//*****************************************************************************
// Init Timer/Counter2 fuer Takterzeugung
void TC2_Init (void){
/* Only uses TIMER2 overflow for tick interrupt. Timer compare
* can also be used.
*/
TIMSK &= ~(BIT(TOIE2)/* | BIT(OCIE2) */); //disable TC2 interrupts
TCCR2 = 0x05; // interner Takt, /1024
TCNT2 = 256-39; // Counter ruecksetzen, 10ms @ 4MHz
// OCR2 = 180; // OutputCompareRegister
TIMSK |= BIT(TOIE2); // enable OVF-interrupt
//TIMSK |= OCIE2; // enable COMP-interrupt
SEI(); // enable global interrupt
}
//*****************************************************************************
// Interrupt Timer/Counter0 Overflow
// OVF_Takt: 4MHz / 1024 / 39 = 10ms
#pragma interrupt_handler OSTickISR:11
// Funktion siehe OS_CPU_A.S
/*
void TC2_OVF (void){ //overflow interrupt vector
}
*/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -