asm內聯彙編及HC08啓動代碼說明

AVR GCC has sei() for __enable_interrupts(), and cli() for __disable_interrupts(). Both of these macros are located in <avr/interrupts.h>.

CLI(clear interrupt)是將處理器標誌寄存器的中斷標誌位清0,不允許中斷。CLI經常與STI(SEI---set interrupt)成對使用,STI(SEI)是將處理器標誌寄存器的中斷標誌位置1,允許中斷。

__asm+彙編指令表示內聯彙編。

#pragma DATA_SEG DEFAULT

/* __asm */
#ifdef _lint             /* 此語句中_lint不明白什麼意思? */
#define __asm(op) (void)(op)/* 宏定義__asm()函數 */
#endif

/* Watchdog reset macro */
#ifdef _lint
extern void WDog_Clear(void);/* 聲明喂狗函數 */
#else
#define WDog_Clear() (void)(SRS = 0x55, SRS = 0xAA)/* 宏定義喂狗函數 */
#endif /* WDog_Clear */

#define NOP() __asm("nop")/* 宏定義 */
#define DI() __asm("sei")  /* Disable interrupts  */
#define EI() __asm("cli")  /* Enable interrupts */
#define DBI() __asm CLI   /* 清除中斷標誌位,不允許中斷 */
#define EBI() __asm STI   /* 中斷標誌位置1,允許中斷 */

#define SaveStatusReg() __asm("PSHA;TPA;SEI;STA CCR_reg;PULA;")
#define RestoreStatusReg() __asm("PSHA;LDA CCR_reg;TAP;PULA;")

 

/*
*********************************************************************************************************
*                                              DATA TYPES
*                                         (Compiler Specific)
*********************************************************************************************************
*/
用於封裝之,使之與compiler無關
typedef unsigned char  BOOLEAN;
typedef unsigned char  INT8U;                    /* Unsigned  8 bit quantity                           */
typedef signed   char  INT8S;                    /* Signed    8 bit quantity                           */
typedef unsigned int   INT16U;                   /* Unsigned 16 bit quantity                           */
typedef signed   int   INT16S;                   /* Signed   16 bit quantity                           */
typedef unsigned long  INT32U;                   /* Unsigned 32 bit quantity                           */
typedef signed   long  INT32S;                   /* Signed   32 bit quantity                           */
typedef float          FP32;                     /* Single precision floating point                    */
typedef double         FP64;                     /* Double precision floating point                    */

typedef unsigned int   OS_STK;                   /* Each stack entry is 16-bit wide                    */

#define BYTE           INT8S                     /* Define data types for backward compatibility ...   */
#define UBYTE          INT8U                     /* ... to uC/OS V1.xx.  Not actually needed for ...   */
#define WORD           INT16S                    /* ... uC/OS-II.                                      */
#define UWORD          INT16U
#define LONG           INT32S
#define ULONG          INT32U

在啓動main函數之前HCS08 C 語言會自動運行一段啓動代碼,進行硬件初始化和建立C語言的運行環境。起動代碼一般由編譯器自動生成,也可以由用戶自寫的啓動代碼替代自動生成的啓動代碼。啓動代碼的名字爲start08.c,它的主要工作是: 
        (1)、 禁止中斷 
        (2)、從ROM到RAM複製並初始化數據

            (3)、 未初始化的數據區域清零

            (4)、爲堆棧分配並初始化堆棧

            (5)、 如果用到堆,創建並初始化堆

            (6)、允許中斷

            (7)、調用main()函數

發佈了8 篇原創文章 · 獲贊 7 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章