?? start12.c
字號(hào):
/***************************************************************************
start12.c - 標(biāo)準(zhǔn)的啟動(dòng)代碼
對(duì)于某些特殊的用戶請(qǐng)求,這個(gè)啟動(dòng)代碼也許是最優(yōu)的
----------------------------------------------------
版權(quán) (c) Metrowerks, Basel, 瑞士
版權(quán)保留
注意:在啟動(dòng)代碼中ROM庫(kù)沒(méi)有執(zhí)行
注意:在HIWARE文件格式中,C++全局變量的析構(gòu)還沒(méi)有被支持。
為了使用這個(gè)特性,請(qǐng)使用ELF文件格式建立你的應(yīng)用程序。
***************************************************************************/
//lint -esym(750, __NO_FLAGS_OFFSET, __NO_MAIN_OFFSET,
// __NO_STACKOFFSET_OFFSET)
//這個(gè)宏移除那些沒(méi)有在啟動(dòng)描述符中使用的域
#define __NO_FLAGS_OFFSET // 在啟動(dòng)數(shù)據(jù)域中我們不需要使用標(biāo)志域
#define __NO_MAIN_OFFSET // 在啟動(dòng)數(shù)據(jù)域中我們不需要使用主域
#define __NO_STACKOFFSET_OFFSET // 在啟動(dòng)數(shù)據(jù)域中我們不需要使用堆棧偏移域
//#define __BANKED_COPY_DOWN : 允許在Flash區(qū)域中分配 .copy
#if defined(__BANKED_COPY_DOWN) && (!defined(__HCS12X__) || \
!defined(__ELF_OBJECT_FILE_FORMAT__))
#error
//the __BANKED_COPY_DOWN僅被使用ELF文件格式的HCS12X所支持
//不被HC12,或者使用HIWARE文件格式的HCS12所支持
#endif
#include "hidef.h"
#include "start12.h"
//**************************************************************************
//下面的宏來(lái)控制啟動(dòng)代碼如何來(lái)操作COP:
// #define _DO_FEED_COP_ : 喂 COP
// #define _DO_ENABLE_COP_:啟用 COP
// #define _DO_DISABLE_COP_: 不啟用 COP
//如果沒(méi)有上面的宏定義,則該啟動(dòng)文件沒(méi)有對(duì)COP進(jìn)行任何操作
//**************************************************************************
// __ONLY_INIT_SP 定義:
//這個(gè)定義為啟動(dòng)代碼選擇一個(gè)更小的版本
//它僅加載堆棧指針,然后直接調(diào)用主函數(shù)。這個(gè)版本不初始化全局變量
//因此這個(gè)版本不是ANSI的。
//**************************************************************************
// __FAR_DATA 定義:
//默認(rèn)情況下,啟動(dòng)代碼僅初始化默認(rèn)的內(nèi)存模式。如果在小的內(nèi)存模式或者擴(kuò)展的內(nèi)
//存模式下,一些內(nèi)存被分配過(guò)遠(yuǎn),當(dāng)__FAR_DATA被定義時(shí),啟動(dòng)代碼會(huì)初始化這些內(nèi)
//存塊。當(dāng)__FAR_DATA沒(méi)有被定義時(shí),連接器將要發(fā)出一個(gè)消息,例如:
//"L1128: Cutting value _Range beg data member from 0xF01000 to 0x1000"
//這個(gè)啟動(dòng)代碼寫(xiě)入到被剪切的地址中。
//**************************************************************************
//__BANKED_COPY_DOWN 定義:
//默認(rèn)情況下,啟動(dòng)代碼使啟動(dòng)數(shù)據(jù)結(jié)構(gòu)_startupData,超過(guò)區(qū)域的零和那些.copy
//選擇區(qū)域全部被分配在NON_BANKED內(nèi)存區(qū)域中。
//特別地,如果有許多或者更大的內(nèi)存區(qū)域要初始化的話,.copy選擇區(qū)可以被分配
//對(duì)HCS12X來(lái)說(shuō),它能通過(guò).copy區(qū)域復(fù)制XGATE內(nèi)存代碼,啟動(dòng)代碼把.copy分配到
//一個(gè)擴(kuò)展的Flash中。當(dāng)增加或者移出這個(gè)宏時(shí).copy在prm文件中的布局將會(huì)改變。
//注意:這個(gè)宏僅被使用ELF格式的HCS12X支持。
//**************************************************************************
#ifdef __cplusplus
#define __EXTERN_C extern "C"
#else
#define __EXTERN_C
#endif
__EXTERN_C void main(void); //主函數(shù)原型
#ifndef __ONLY_INIT_SP
#pragma DATA_SEG __NEAR_SEG STARTUP_DATA //_startupData能使用16位尋址
//這個(gè)需要因?yàn)樗硕褩n^,并且沒(méi)有堆棧,但遠(yuǎn)數(shù)據(jù)不能被訪問(wèn)
//lint -e1065
struct _tagStartup _startupData;//只讀:
//_startupData被分配在ROM 并且被連接器初始化
//lint +e1065
#pragma DATA_SEG DEFAULT
#endif // __ONLY_INIT_SP
#if defined(FAR_DATA) && (!defined(__HCS12X__) \
|| defined(__BANKED_COPY_DOWN))
#include "non_bank.sgm"
//如果使用了擴(kuò)展的變量,那么初始函數(shù)必須放在非擴(kuò)展的內(nèi)存區(qū)域中
//因?yàn)開(kāi)SET_PAGE被調(diào)用,它可能會(huì)改變頁(yè)寄存器
//內(nèi)聯(lián)的匯編程序需要一個(gè)原型
//這是一個(gè)使用特殊調(diào)用方法的實(shí)時(shí)程序,不要在C代碼中使用它
__EXTERN_C void _SET_PAGE(void);
#else
#include "default.sgm"
#endif // defined(FAR_DATA) && (!defined(__HCS12X__)
// || defined(__BANKED_COPY_DOWN))
//為Windef寄存器定義值和位
#ifdef HC812A4
#define WINDEF (*(volatile unsigned char*) 0x37)
#if defined( __BANKED__) || defined(__LARGE__) || defined(__PPAGE__)
#define __ENABLE_PPAGE__ 0x40
#else
#define __ENABLE_PPAGE__ 0x0
#endif
#if defined(__DPAGE__)
#define __ENABLE_DPAGE__ 0x80
#else
#define __ENABLE_DPAGE__ 0x0
#endif
#if defined(__EPAGE__)
#define __ENABLE_EPAGE__ 0x20
#else
#define __ENABLE_EPAGE__ 0x0
#endif
#endif //HC812A4
#ifdef _HCS12_SERIALMON
//為了支持EB386,需要監(jiān)視在內(nèi)存和EEPROM中的基本軟件,
//這是通過(guò)編輯內(nèi)存和EEPROM區(qū)域來(lái)實(shí)現(xiàn)的。
#define ___INITRM (*(volatile unsigned char *) 0x0010)
#define ___INITRG (*(volatile unsigned char *) 0x0011)
#define ___INITEE (*(volatile unsigned char *) 0x0012)
#endif
#if defined(_DO_FEED_COP_)
#define __FEED_COP_IN_HLI() \
} __asm movb #0x55, _COP_RST_ADR; __asm movb #0xAA, _COP_RST_ADR; __asm {
#else
#define __FEED_COP_IN_HLI() //不做任何操作
#endif
#ifndef __ONLY_INIT_SP
#if (!defined(FAR_DATA) || defined(__HCS12X__)) && (defined( __BANKED__) \
|| defined(__LARGE__) || defined(__BANKED_COPY_DOWN))
static void __far Init(void)
#else
static void Init(void)
#endif
{
//目的: 1) 數(shù)據(jù)被分配在zero out RAM-areas
// 2) 從ROM中復(fù)制初始化數(shù)據(jù)到RAM中
// 3) 在C++中調(diào)用全局構(gòu)造函數(shù)
//調(diào)用者:_Startup, LibInits
__asm {
ZeroOut:
#if defined(__HIWARE_OBJECT_FILE_FORMAT__) && defined(__LARGE__)
LDX _startupData.pZeroOut:1 //在HIWARE文件格式的大內(nèi)存模式下,
//pZeroOut是24位指針
#else
LDX _startupData.pZeroOut //*pZeroOut
#endif
LDY _startupData.nofZeroOuts //nofZeroOuts
BEQ CopyDown //如果沒(méi)有0,則退出
NextZeroOut: PSHY //保存nofZeroOuts
#if defined(FAR_DATA)
LDAB 1,X+ //裝載目的地址頁(yè)
LDY 2,X+ //裝載目的地址偏移地址
#if defined(__HCS12X__)
STAB __GPAGE_ADR__
#else //defined(__HCS12X__)
__PIC_JSR(_SET_PAGE) //在正確的頁(yè)面寄存器中設(shè)置頁(yè)值
#endif //defined(__HCS12X__)
#else //FAR_DATA
LDY 2,X+ //開(kāi)始地址 (X = X+4)
#endif //FAR_DATA
#if defined(__HCS12X__) && defined(FAR_DATA)
PSHX
LDX 0,X //字節(jié)計(jì)數(shù)
#if defined(__OPTIMIZE_FOR_SIZE__)
CLRA
NextWord: GSTAA 1,Y+ //清內(nèi)存字節(jié)
__FEED_COP_IN_HLI() //如果有必要就喂COP
DBNE X, NextWord //字節(jié)計(jì)數(shù)自減
#else
LDD #0
LSRX
BEQ LoopClrW1 //我們復(fù)制了多于一個(gè)字節(jié)嗎?
NextWord: GSTD 2,Y+ //清內(nèi)存字節(jié)
__FEED_COP_IN_HLI() //如果有必要就喂COP
DBNE X, NextWord //字節(jié)計(jì)數(shù)自減
LoopClrW1:
BCC LastClr //處理最后一個(gè)字節(jié)
GSTAA 1,Y+ //處理最后一個(gè)字節(jié)
LastClr:
#endif
PULX
LEAX 2,X
#elif defined(__OPTIMIZE_FOR_SIZE__) //-os, 默認(rèn)
LDD 2,X+ //字節(jié)計(jì)數(shù)
NextWord: CLR 1,Y+ //清內(nèi)存字節(jié)
__FEED_COP_IN_HLI() //如果有必要就喂COP
DBNE D, NextWord //字節(jié)計(jì)數(shù)自減
#else //__OPTIMIZE_FOR_TIME__
LDD 2,X+ //字節(jié)計(jì)數(shù)
LSRD //除以2并且保存位0到標(biāo)志Carry中
BEQ LoopClrW1 //我們復(fù)制了多于一個(gè)字節(jié)嗎?
PSHX
LDX #0
LoopClrW: STX 2,Y+ //字清零
__FEED_COP_IN_HLI() //如果有必要就喂COP
DBNE D, LoopClrW
PULX
LoopClrW1:
BCC LastClr //處理最后一個(gè)字節(jié)
CLR 1,Y+
LastClr:
#endif //__OPTIMIZE_FOR_SIZE__/__OPTIMIZE_FOR_TIME__
PULY //恢復(fù) nofZeroOuts
DEY //nofZeroOuts自減
BNE NextZeroOut
CopyDown:
#if defined(__BANKED_COPY_DOWN)
LDAA _startupData.toCopyDownBeg:0 //取得.copy區(qū)域的頁(yè)地址
STAA __PPAGE_ADR__ // 設(shè)置頁(yè)地址
LDX _startupData.toCopyDownBeg:1 //裝載復(fù)制目的地址
#elif defined(__ELF_OBJECT_FILE_FORMAT__)
LDX _startupData.toCopyDownBeg //裝載復(fù)制目的地址
#else
LDX _startupData.toCopyDownBeg:2 //裝載復(fù)制目的地址
#endif
NextBlock:
LDD 2,X+ //初始數(shù)據(jù)的大小-> D
BEQ funcInits //目的地址結(jié)束
#ifdef FAR_DATA
PSHD //保存計(jì)數(shù)器
LDAB 1,X+ //裝載目的頁(yè)
LDY 2,X+ //目的地址
#if defined(__HCS12X__)
STAB __GPAGE_ADR__
#else //__HCS12X__
__PIC_JSR(_SET_PAGE) //設(shè)置目的頁(yè)寄存器
#endif //__HCS12X__
PULD //恢復(fù)計(jì)數(shù)器
#else //FAR_DATA
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -