asm内联汇编及HC08启动代码说明

来源:互联网 发布:pm2 node 编辑:程序博客网 时间:2024/06/06 02:09

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()函数

0 0