📄 680x0.txt
字号:
/*
*********************************************************************************************************
* uC/OS
* The Real-Time Kernel
* 680x0 Target
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* File : INCLUDES.H
* By : Jean J. Labrosse
*********************************************************************************************************
*/
#include "OS_CFG.H" /* Defines for PRODUCT specification */
#include "M680x0.H" /* uC/OS defines for the 680x0 */
#include "\SOFTWARE\UCOS\SOURCE\UCOS.H" /* uC/OS portable header file */
#include <STYPES.H>
#include <SIM30.H>
#include <QSM30.H>
#include <RAM30.H>
#include <TPU30.H>
/*
*********************************************************************************************************
* File : 680x0.C
* By : Jean J. Labrosse
*********************************************************************************************************
*/
#include "INCLUDES.H"
/*
*********************************************************************************************************
* CREATE A TASK
*********************************************************************************************************
*/
UBYTE OSTaskCreate(void (OS_FAR *task)(void *pd), void *pdata, void *pstk, UBYTE p)
{
ULONG *sp;
UBYTE err;
OS_ENTER_CRITICAL();
if (OSTCBPrioTbl[p] == (OS_TCB *)0) { /* See if task already exist */
OS_EXIT_CRITICAL();
sp = (ULONG *)((ULONG)pstk & (ULONG)0xFFFFFFFCL);/* Align stack on LONG boundary */
*--sp = (ULONG)pdata;
*--sp = (ULONG)task;
#if !(OS_CPU_68000 || OS_CPU_68008) /* Format/Vector Offset ... */
*--(UWORD *)sp = (UWORD)(0x0080 + 4 * OS_TRAP_NBR); /* ... for > 68000 and 68008 CPUs */
#endif
*--sp = (ULONG)task;
*--(UWORD *)sp = OS_INITIAL_SR; /* initial SR value */
*--sp = (ULONG)0x000000A6L; /* A6 = 0xA6 (set reg. value to identify itself) */
*--sp = OSGlobalData; /* A5 = OSGlobalData (must be set in startup code) */
*--sp = (ULONG)0x000000A4L; /* A4 = 0xA4 */
*--sp = (ULONG)0x000000A3L; /* A3 = 0xA3 */
*--sp = (ULONG)0x000000A2L; /* A2 = 0xA2 */
*--sp = (ULONG)0x000000A1L; /* A1 = 0xA1 */
*--sp = (ULONG)0x000000A0L; /* A0 = 0xA0 */
*--sp = (ULONG)0x000000D7L; /* D7 = 0xD7 (set reg. value to identify itself) */
*--sp = (ULONG)0x000000D6L; /* D6 = 0xD6 */
*--sp = (ULONG)0x000000D5L; /* D5 = 0xD5 */
*--sp = (ULONG)0x000000D4L; /* D4 = 0xD4 */
*--sp = (ULONG)0x000000D3L; /* D3 = 0xD3 */
*--sp = (ULONG)0x000000D2L; /* D2 = 0xD2 */
*--sp = (ULONG)0x000000D1L; /* D1 = 0xD1 */
*--sp = (ULONG)0x000000D0L; /* D0 = 0xD0 */
err = OSTCBInit(p, (void OS_FAR *)sp); /* Get and initialize a TCB */
if (err == OS_NO_ERR) {
if (OSRunning) { /* Find HPT if multitasking has started */
OSSched();
}
}
return (err);
} else {
OS_EXIT_CRITICAL();
return (OS_PRIO_EXIST);
}
}
/*
*********************************************************************************************************
* START HIGHEST PRIORITY TASK READY-TO-RUN
*********************************************************************************************************
*/
void OSStartHighRdy(void)
{
_ASMLINE(" XREF _OSTCBCur ");
_ASMLINE(" XREF _OSTCBHighRdy ");
_ASMLINE(" MOVE.L (_OSTCBHighRdy),A1 ; Get TCB of highest priority task ready to run ");
_ASMLINE(" MOVE.L A1,(_OSTCBCur) ");
_ASMLINE(" MOVE.L (A1),A7 ; Get ptr to top of task's stack ");
_ASMLINE(" MOVEM.L (A7)+,A0-A6/D0-D7 ");
_ASMLINE(" RTE ; Return to task ");
}
/*
*********************************************************************************************************
* TASK LEVEL CONTEXT SWITCH
*********************************************************************************************************
*/
void OS_FAR OSCtxSw(void)
{
_ASMLINE(" XREF _OSTCBCur ");
_ASMLINE(" XREF _OSTCBHighRdy ");
_ASMLINE(" MOVEM.L A0-A6/D0-D7,-(A7) ; Save current task's context ");
_ASMLINE(" MOVE.L (_OSTCBCur),A1 ; Save stack pointer in current task's TCB ");
_ASMLINE(" MOVE.L A7,(A1) ");
_ASMLINE(" MOVE.L (_OSTCBHighRdy),A1 ; Point to highest priority's task TCB ");
_ASMLINE(" MOVE.L A1,(_OSTCBCur) ; This is now the current TCB ");
_ASMLINE(" MOVE.L (A1),A7 ; Get new task's stack pointer ");
_ASMLINE(" MOVEM.L (A7)+,A0-A6/D0-D7 ");
_ASMLINE(" RTE ; Return to new task ");
}
/*
*********************************************************************************************************
* INTERRUPT LEVEL CONTEXT SWITCH
*********************************************************************************************************
*/
void OSIntCtxSw(void)
{
_ASMLINE(" ADDA #18,A7 ; Ignore calls to OSIntExit, OSIntCtxSw and locals. ");
_ASMLINE(" MOVE.L (_OSTCBCur),A1 ; Save stack pointer in current task's TCB ");
_ASMLINE(" MOVE.L A7,(A1) ");
_ASMLINE(" MOVE.L (_OSTCBHighRdy),A1 ; Point to highest priority's task TCB ");
_ASMLINE(" MOVE.L A1,(_OSTCBCur) ; This is now the current TCB ");
_ASMLINE(" MOVE.L (A1),A7 ; Get new task's stack pointer ");
_ASMLINE(" MOVEM.L (A7)+,A0-A6/D0-D7 ");
_ASMLINE(" RTE ; Return to new task ");
}
/*
*********************************************************************************************************
* SYSTEM TICK ISR
*********************************************************************************************************
*/
void OS_FAR OSTickISR(void)
{
_ASMLINE(" MOVEM.L D0-D7/A0-A6,-(A7) ; Save current task's context ");
OSIntNesting++; /* Notify uC/OS about the ISR */
/* Clear the tick interrupt source */
OSTimeTick(); /* Notify uC/OS that a TICK has occurred */
OSIntExit(); /* Invoke the scheduler to see if a HPT is R-to-R */
_ASMLINE(" MOVEM.L (A7)+,D0-D7/A0-A6 ; Restore task's context ");
_ASMLINE(" RTE ; Return to interrupted task ");
}
/*
*********************************************************************************************************
* File : M680x0.H
* By : Jean J. Labrosse
*********************************************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -