⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 680x0.txt

📁 c的源码
💻 TXT
📖 第 1 页 / 共 2 页
字号:
/*
*********************************************************************************************************
*                                                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 + -