Dr. Schuster György október 14.

Hasonló dokumentumok
ARM (Advanced RISC Machine)

C programozási nyelv

1. Bevezetés szeptember 9. BME Fizika Intézet. Szám. szim. labor ea. Tőke Csaba. Tudnivalók. feladat. Tematika. Moodle Házi feladatok

C++ programok fordítása

Mechatronika és mikroszámítógépek 2017/2018 I. félév. Bevezetés a C nyelvbe

Nagyteljesítményű mikrovezérlők 10b. RTOS gyakorlatok

GPU Lab. 5. fejezet. A C++ fordítási modellje. Grafikus Processzorok Tudományos Célú Programozása. Berényi Dániel Nagy-Egri Máté Ferenc

A PROGAMOZÁS ALAPJAI 1. Függvény mint függvény paramétere. Függvény mint függvény paramétere. Függvény mint függvény paramétere

Kiszolgálók üzemeltetése. Iványi Péter

1.1. A forrásprogramok felépítése Nevek és kulcsszavak Alapvető típusok. C programozás 3

C programozás. 1 óra Bevezetés

Programozás C nyelven FELÜLNÉZETBŐL elhullatott MORZSÁK. Sapientia EMTE

15. Programok fordítása és végrehajtása

Bevezetés a programozásba Előadás: Fordítási egység

Pénzügyi algoritmusok

4. Laborgyakorlat. A fájlokról ezeket az adatokat, a fájlrendszer tárolja. Számunkra az 1, 3, 4. oszlopok lesznek az érdekesek.

Dr. Schuster György október 3.

Programozási alapismeretek beadandó feladat: ProgAlap beadandó feladatok téma 99. feladat 1

3. Osztályok II. Programozás II

Programozás alapjai gyakorlat. 2. gyakorlat C alapok

Programozás I. gyakorlat

Bevezetés a programozásba Előadás: A const

Algoritmizálás és adatmodellezés tanítása beadandó feladat: Algtan1 tanári beadandó /99 1

Programozás 1. Dr. Iványi Péter

Mobil Informatikai Rendszerek

Bevezetés a programozásba Előadás: Objektumszintű és osztályszintű elemek, hibakezelés

Java II. I A Java programozási nyelv alapelemei

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon

Járműfedélzeti rendszerek II. 2. előadás Dr. Bécsi Tamás

Fordítóprogramok. Aszalós László szeptember 7.

Mikroprocesszor CPU. C Central Központi. P Processing Számító. U Unit Egység

S z á m í t ó g é p e s a l a p i s m e r e t e k

Bevezetés a Programozásba II 4. előadás. Adattípusok hordozhatósága

12. gyakorlat Enum; Tárolási osztályok Preprocesszor utasítások; Moduláris programozás

AWK programozás, minták, vezérlési szerkezetek

2017/01/27 08:59 1/6 Gettext Rendszer

Dinamikus csatolású függvénykönyvtár készítése és használata Plugin-szerű betöltés Egyszeű C++ osztályok készítése

C programozás. 6 óra Függvények, függvényszerű makrók, globális és

Bevezetés, a C++ osztályok. Pere László

Az MSP430 mikrovezérlők digitális I/O programozása

Programozás alapjai 2.Gy: A C nyelv alapjai P R O

OOP I. Egyszerő algoritmusok és leírásuk. Készítette: Dr. Kotsis Domokos

Programozás 6. Dr. Iványi Péter

Programzás I gyakorlat

Programozás C++ -ban 2007/7

Java II. I A Java programozási nyelv alapelemei

Programozás 5. Dr. Iványi Péter

Programozás alapjai 9.Gy: Struktúra 2.

A Számítógépek felépítése, mőködési módjai

Operációs rendszerek. 9. gyakorlat. BASH recap, reguláris kifejezések UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED

Mobil Informatikai Rendszerek

C programozási nyelv. Dr. Schuster György szeptember 18.

Operációs rendszerek. 6. gyakorlat: Processzusok közti kommunikáció (osztott memória, üzenetsor)

1. Alapok. Programozás II

Programozás C és C++ -ban

Máté: Assembly programozás

C programozási nyelv Pointerek, tömbök, pointer aritmetika

Iman 3.0 szoftverdokumentáció

Programozási nyelvek (ADA)

Algoritmizálás és adatmodellezés tanítása beadandó feladat: Algtan1 tanári beadandó /99 1

Programozás alapjai II. (1. ea) C++

Programozás alapjai II. (1. ea) C++

PROGRAMOZÁSI NYELVEK - CPP. ELŐADÁS JEGYZET

Szkriptnyelvek. 1. UNIX shell

Pénzügyi algoritmusok

Programozás 3. Dr. Iványi Péter

Memóriagazdálkodás. Kódgenerálás. Kódoptimalizálás

Bevezetés a programozásba I.

Programozás alapjai. (GKxB_INTM023) Dr. Hatwágner F. Miklós október 11. Széchenyi István Egyetem, Gy r

Függvények. Programozás I. Hatwágner F. Miklós november 16. Széchenyi István Egyetem, Gy r

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós március 3. Széchenyi István Egyetem, Gy r

PE/COFF fájl formátum

Labor 2 Mikrovezérlők

Bevezetés a programozásba I.

Programozás II gyakorlat. 4. Öröklődés

Operációs rendszerek gyak.

Operációs rendszerek gyak.

Operációs rendszerek 2 1. óra: Linux alapok Ismétlés. Windisch Gergely félév

Írásjogtól Rootig AIX-on

Mintavételes szabályozás mikrovezérlő segítségével

Operációs rendszerek. 11. gyakorlat. AWK - szintaxis, vezérlési szerkezetek UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED

AWK programozás, minták, vezérlési szerkezetek

C++ Gyakorlat jegyzet 7. óra

ARM Cortex magú mikrovezérlők

The modular mitmót system. DPY kijelző kártya C API

Operációs rendszerek. 9. gyakorlat. Reguláris kifejezések - alapok, BASH UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED

Cekla. Készítette Doxygen Tue Sep :13:44

Memóriakezelés, dinamikus memóriakezelés

Vizuális, eseményvezérelt programozás XI.

AWK programozás Bevezetés

OOP #14 (referencia-elv)

C/C++ programozás UNIX környezetben

Programozás alapjai Bevezetés

Labor gyakorlat Mikrovezérlők

GPU Lab. 4. fejezet. Fordítók felépítése. Grafikus Processzorok Tudományos Célú Programozása. Berényi Dániel Nagy-Egri Máté Ferenc

Entity Framework alapú adatbáziselérés

Óbudai Egyetem. C programozási nyelv

Programozás II gyakorlat. 6. Polimorfizmus

Szoftver tervezés EDK. Kizárólag oktatási célra. Compile. PlatGen. Synthesis. LibGen. ISE/Xflow. Link. Data2MEM. Hardware. MSS File system.

Az interrupt Benesóczky Zoltán 2004

Átírás:

Real-time operációs rendszerek RTOS 2011. október 14.

A fordítás vázlata prog.c Előfeldolgozó Átmenti állomány Fordító prog.obj más.obj-tek könyvtárak indító kód Linker futtatható kód

Ismétlés Előfeldolgozó a nyers forráskódból ember számára nem olvasható, de a fordító számára optimális átmeneti állomány készít. Továbbá végrehajtja az előfeldolgozó utasításokat.

Ismétlés Előfeldolgozó a nyers forráskódból ember számára nem olvasható, de a fordító számára optimális átmeneti állomány készít. Továbbá végrehajtja az előfeldolgozó utasításokat. Fordító az előfeldolgozott állományból már bináris, de még futásra nem kész - úgynevezett object - állomány készül,

Ismétlés Előfeldolgozó a nyers forráskódból ember számára nem olvasható, de a fordító számára optimális átmeneti állomány készít. Továbbá végrehajtja az előfeldolgozó utasításokat. Fordító az előfeldolgozott állományból már bináris, de még futásra nem kész - úgynevezett object - állomány készül, Linker öszefűzi a lefordított object és könyvtári állományokat.

Ismétlés Előfeldolgozó a nyers forráskódból ember számára nem olvasható, de a fordító számára optimális átmeneti állomány készít. Továbbá végrehajtja az előfeldolgozó utasításokat. Fordító az előfeldolgozott állományból már bináris, de még futásra nem kész - úgynevezett object - állomány készül, Linker öszefűzi a lefordított object és könyvtári állományokat. Indító kód (startup kód) speciális programmodul, amely még a main előtt lefut, inicializálja a rendszert és a programot.

Megszakítás vektortábla. static unsigned long pulstack[64]; attribute ((section(".isr_vector"))) void (* const g_pfnvectors[])(void) = { (void (*)(void))((unsigned long)pulstack + sizeof(pulstack)), // The initial stack pointer ResetISR, // The reset handler NmiSR, // The NMI handler FaultISR, // The hard fault handler IntDefaultHandler, // The MPU fault handler IntDefaultHandler, // The bus fault handler IntDefaultHandler, // The usage fault handler 0, // Reserved 0, // Reserved 0, // Reserved 0, // Reserved IntDefaultHandler, // SVCall handler. }

Részenként static unsigned long pulstack[64];

Részenként static unsigned long pulstack[64]; attribute ((section(".isr_vector")))

Részenként static unsigned long pulstack[64]; attribute ((section(".isr_vector"))) void (* const g_pfnvectors[])(void)

Részenként static unsigned long pulstack[64]; attribute ((section(".isr_vector"))) void (* const g_pfnvectors[])(void) (void(*)(void))((unsigned long)pulstack + sizeof(pulstack))

Részenként static unsigned long pulstack[64]; attribute ((section(".isr_vector"))) void (* const g_pfnvectors[])(void) (void(*)(void))((unsigned long)pulstack + sizeof(pulstack)) ResetISR,

Szegmensek.text a futtatható kód szegmense,

Szegmensek.text a futtatható kód szegmense,.rodata csak olvasható adatok területe,

Szegmensek.text a futtatható kód szegmense,.rodata csak olvasható adatok területe,.data az inicializált globális és statikus változók szegmense,

Szegmensek.text a futtatható kód szegmense,.rodata csak olvasható adatok területe,.data az inicializált globális és statikus változók szegmense,.bss a nem inicializált statikus változók szegmense.

Szegmensek.text a futtatható kód szegmense,.rodata csak olvasható adatok területe,.data az inicializált globális és statikus változók szegmense,.bss a nem inicializált statikus változók szegmense. vectors.text.rodata.data.data.bss load és runtime load runtime

ResetISR void ResetISR(void) { unsigned long *pulsrc, *puldest; pulsrc = &_etext; for(puldest=&_data;puldest<&_edata;) { *puldest++ = *pulsrc++; } for(puldest=&_bss;puldest<&_ebss;) { *puldest++ = 0; } main(); } Ahol: _etext a.text szegmens vége utáni első szabad cím, _ebss a.bssdr. szegmens Schuster György vége utáni Real-time első operációs szabad rendszerek cím. RTOS

Figyelmeztetés!!!

Figyelmeztetés!!! Biztonsági intézkedés mielőtt a PLL-hez nyúlnál!!!

Figyelmeztetés!!! Biztonsági intézkedés mielőtt a PLL-hez nyúlnál!!! A PLL átprogramozásánál előfordulhat, hogy azt:

Figyelmeztetés!!! Biztonsági intézkedés mielőtt a PLL-hez nyúlnál!!! A PLL átprogramozásánál előfordulhat, hogy azt: 1 véletlenül kikapcsolod,

Figyelmeztetés!!! Biztonsági intézkedés mielőtt a PLL-hez nyúlnál!!! A PLL átprogramozásánál előfordulhat, hogy azt: 1 véletlenül kikapcsolod, 2 olyan frekvenciát állítasz be, amivel a processzor már nem képes futni.

Figyelmeztetés!!! Biztonsági intézkedés mielőtt a PLL-hez nyúlnál!!! A PLL átprogramozásánál előfordulhat, hogy azt: 1 véletlenül kikapcsolod, 2 olyan frekvenciát állítasz be, amivel a processzor már nem képes futni. Ekkor az eszköz valójában használhatatlanná válik.

Figyelmeztetés!!! Biztonsági intézkedés mielőtt a PLL-hez nyúlnál!!! A PLL átprogramozásánál előfordulhat, hogy azt: 1 véletlenül kikapcsolod, 2 olyan frekvenciát állítasz be, amivel a processzor már nem képes futni. Ekkor az eszköz valójában használhatatlanná válik. Ezért fejlesztéskor mindig tarts fenn egy bemeneti bitet, amelyet még a startup kódban megvizsgálsz és ha az egy adott logikai szinten van kergesd a processzort végtelen ciklusba. Ebből csak akkor léphet ki ha ez a bemeneti szint megszünt.

Figyelmeztetés!!! Biztonsági intézkedés mielőtt a PLL-hez nyúlnál!!! A PLL átprogramozásánál előfordulhat, hogy azt: 1 véletlenül kikapcsolod, 2 olyan frekvenciát állítasz be, amivel a processzor már nem képes futni. Ekkor az eszköz valójában használhatatlanná válik. Ezért fejlesztéskor mindig tarts fenn egy bemeneti bitet, amelyet még a startup kódban megvizsgálsz és ha az egy adott logikai szinten van kergesd a processzort végtelen ciklusba. Ebből csak akkor léphet ki ha ez a bemeneti szint megszünt. És csak, csakis ezután a ciklus után állítsd a PLL-t.

Figyelmeztetés!!! Biztonsági intézkedés mielőtt a PLL-hez nyúlnál!!! A PLL átprogramozásánál előfordulhat, hogy azt: 1 véletlenül kikapcsolod, 2 olyan frekvenciát állítasz be, amivel a processzor már nem képes futni. Ekkor az eszköz valójában használhatatlanná válik. Ezért fejlesztéskor mindig tarts fenn egy bemeneti bitet, amelyet még a startup kódban megvizsgálsz és ha az egy adott logikai szinten van kergesd a processzort végtelen ciklusba. Ebből csak akkor léphet ki ha ez a bemeneti szint megszünt. És csak, csakis ezután a ciklus után állítsd a PLL-t. Különben

A fordítás a paranccsal történik.

A fordítás a paranccsal történik. A a Makefile nevű állományt olvassa. Ez tartalmazza a fordítási szabályokat.

A fordítás a paranccsal történik. A a Makefile nevű állományt olvassa. Ez tartalmazza a fordítási szabályokat. Tanács: elsőre használjunk gyári Makefile-t.

A fordítás a paranccsal történik. A a Makefile nevű állományt olvassa. Ez tartalmazza a fordítási szabályokat. Tanács: elsőre használjunk gyári Makefile-t. A speciális nyelvvel rendelkezik, ami hasonlít a shell scripthez, de nem azonos vele.

A fordítás a paranccsal történik. A a Makefile nevű állományt olvassa. Ez tartalmazza a fordítási szabályokat. Tanács: elsőre használjunk gyári Makefile-t. A speciális nyelvvel rendelkezik, ami hasonlít a shell scripthez, de nem azonos vele. A példában lévő Makefile két állományt hív meg, ezek:

A fordítás a paranccsal történik. A a Makefile nevű állományt olvassa. Ez tartalmazza a fordítási szabályokat. Tanács: elsőre használjunk gyári Makefile-t. A speciális nyelvvel rendelkezik, ami hasonlít a shell scripthez, de nem azonos vele. A példában lévő Makefile két állományt hív meg, ezek: egy defs állományt, amely az összes példára érvényes általános szabályokat tartalmazza,

A fordítás a paranccsal történik. A a Makefile nevű állományt olvassa. Ez tartalmazza a fordítási szabályokat. Tanács: elsőre használjunk gyári Makefile-t. A speciális nyelvvel rendelkezik, ami hasonlít a shell scripthez, de nem azonos vele. A példában lévő Makefile két állományt hív meg, ezek: egy defs állományt, amely az összes példára érvényes általános szabályokat tartalmazza, a linker script-et.

Makefile # Milyen eszközre fordítunk PART=LM3S9B92

Makefile # Milyen eszközre fordítunk PART=LM3S9B92 # Hol van a gyökere a fordításnak ROOT=../../..

Makefile # Milyen eszközre fordítunk PART=LM3S9B92 # Hol van a gyökere a fordításnak ROOT=../../.. # A közös fordítás állománya include ${ROOT}/defs

Makefile # Milyen eszközre fordítunk PART=LM3S9B92 # Hol van a gyökere a fordításnak ROOT=../../.. # A közös fordítás állománya include ${ROOT}/defs # Hol vannak a header-ek, amelyek nem a forráskönyvtárban vannak IPATH=../../..

Makefile # Milyen eszközre fordítunk PART=LM3S9B92 # Hol van a gyökere a fordításnak ROOT=../../.. # A közös fordítás állománya include ${ROOT}/defs # Hol vannak a header-ek, amelyek nem a forráskönyvtárban vannak IPATH=../../.. # Az általános szabály, a bináris építésére all: ${COMPILER} all: ${COMPILER}/blinky.axf

Makefile # Milyen eszközre fordítunk PART=LM3S9B92 # Hol van a gyökere a fordításnak ROOT=../../.. # A közös fordítás állománya include ${ROOT}/defs # Hol vannak a header-ek, amelyek nem a forráskönyvtárban vannak IPATH=../../.. # Az általános szabály, a bináris építésére all: ${COMPILER} all: ${COMPILER}/blinky.axf # A törlési szabály clean: rm -rf ${COMPILER} ${wildcard * }

Makefile # Milyen eszközre fordítunk PART=LM3S9B92 # Hol van a gyökere a fordításnak ROOT=../../.. # A közös fordítás állománya include ${ROOT}/defs # Hol vannak a header-ek, amelyek nem a forráskönyvtárban vannak IPATH=../../.. # Az általános szabály, a bináris építésére all: ${COMPILER} all: ${COMPILER}/blinky.axf # A törlési szabály clean: rm -rf ${COMPILER} ${wildcard * } # A cél könyvtár el}oállítása ${COMPILER}: mkdir -p ${COMPILER}

Makefile # Milyen eszközre fordítunk PART=LM3S9B92 # Hol van a gyökere a fordításnak ROOT=../../.. # A közös fordítás állománya include ${ROOT}/defs # Hol vannak a header-ek, amelyek nem a forráskönyvtárban vannak IPATH=../../.. # Az általános szabály, a bináris építésére all: ${COMPILER} all: ${COMPILER}/blinky.axf # A törlési szabály clean: rm -rf ${COMPILER} ${wildcard * } # A cél könyvtár el}oállítása ${COMPILER}: mkdir -p ${COMPILER} # A források fordítása és a linker script hívása ${COMPILER}/blinky.axf: ${COMPILER}/blinky.o ${COMPILER}/blinky.axf: ${COMPILER}/startup_${COMPILER}.o ${COMPILER}/blinky.axf: blinky.ld SCATTERgcc_blinky=blinky.ld ENTRY_blinky=ResetISR

Makefile # Milyen eszközre fordítunk PART=LM3S9B92 # Hol van a gyökere a fordításnak ROOT=../../.. # A közös fordítás állománya include ${ROOT}/defs # Hol vannak a header-ek, amelyek nem a forráskönyvtárban vannak IPATH=../../.. # Az általános szabály, a bináris építésére all: ${COMPILER} all: ${COMPILER}/blinky.axf # A törlési szabály clean: rm -rf ${COMPILER} ${wildcard * } # A cél könyvtár el}oállítása ${COMPILER}: mkdir -p ${COMPILER} # A források fordítása és a linker script hívása ${COMPILER}/blinky.axf: ${COMPILER}/blinky.o ${COMPILER}/blinky.axf: ${COMPILER}/startup_${COMPILER}.o ${COMPILER}/blinky.axf: blinky.ld SCATTERgcc_blinky=blinky.ld ENTRY_blinky=ResetISR # A függ}o fájlok automatikus generálása ifneq (${MAKECMDGOALS},clean) -include ${wildcard ${COMPILER}/*.d} dummy endif

defs A defs egy olyan általános célú állomány, amely minden alkalmazásra alkalmazható.

defs A defs egy olyan általános célú állomány, amely minden alkalmazásra alkalmazható. Alapvető beállításokat tartalmaz, úgymint:

defs A defs egy olyan általános célú állomány, amely minden alkalmazásra alkalmazható. Alapvető beállításokat tartalmaz, úgymint: - a környezet nevét,

defs A defs egy olyan általános célú állomány, amely minden alkalmazásra alkalmazható. Alapvető beállításokat tartalmaz, úgymint: - a környezet nevét, - a fordító program nevét és elérési útját,

defs A defs egy olyan általános célú állomány, amely minden alkalmazásra alkalmazható. Alapvető beállításokat tartalmaz, úgymint: - a környezet nevét, - a fordító program nevét és elérési útját, - a könyvtári állományok elérési útját,

defs A defs egy olyan általános célú állomány, amely minden alkalmazásra alkalmazható. Alapvető beállításokat tartalmaz, úgymint: - a környezet nevét, - a fordító program nevét és elérési útját, - a könyvtári állományok elérési útját, - a fordításhoz szükséges flag-eket,

defs A defs egy olyan általános célú állomány, amely minden alkalmazásra alkalmazható. Alapvető beállításokat tartalmaz, úgymint: - a környezet nevét, - a fordító program nevét és elérési útját, - a könyvtári állományok elérési útját, - a fordításhoz szükséges flag-eket, - a fordítási parancs végrehajtását,

defs A defs egy olyan általános célú állomány, amely minden alkalmazásra alkalmazható. Alapvető beállításokat tartalmaz, úgymint: - a környezet nevét, - a fordító program nevét és elérési útját, - a könyvtári állományok elérési útját, - a fordításhoz szükséges flag-eket, - a fordítási parancs végrehajtását, - a linker parancs végrehajtását,

defs A defs egy olyan általános célú állomány, amely minden alkalmazásra alkalmazható. Alapvető beállításokat tartalmaz, úgymint: - a környezet nevét, - a fordító program nevét és elérési útját, - a könyvtári állományok elérési útját, - a fordításhoz szükséges flag-eket, - a fordítási parancs végrehajtását, - a linker parancs végrehajtását, - a bináris image előállítását.

Linker script MEMORY { FLASH (rx):origin=0x00000000,length=256k SRAM (rwx):origin=0x20000000,length=96k } SECTIONS {.text : { KEEP(*(.isr_vector)) *(.text*) *(.rodata*) _etext =.; } > FLASH.data:AT(ADDR(.text)+SIZEOF(.text)) { _data =.; *(vtable) *(.data*) _edata =.; } > SRAM }

ROM rutinok használata A rom rutinok elérése a rom.h segítségével történhet. A rom rutinok használatához a #define TARGET_IS_TEMPEST_RC1 1 fordításidejű konstanst a rom.h hívása előtt definiálni kell.

ROM rutinok használata A rom rutinok elérése a rom.h segítségével történhet. A rom rutinok használatához a #define TARGET_IS_TEMPEST_RC1 1 fordításidejű konstanst a rom.h hívása előtt definiálni kell. #define ROM_APITABLE ((unsigned long *)0x01000010)

ROM rutinok használata A rom rutinok elérése a rom.h segítségével történhet. A rom rutinok használatához a #define TARGET_IS_TEMPEST_RC1 1 fordításidejű konstanst a rom.h hívása előtt definiálni kell. #define ROM_APITABLE #define ROM_VERSION #define ROM_UARTTABLE #define ROM_SSITABLE ((unsigned long *)0x01000010) (ROM_APITABLE[0]) ((unsigned long *)(ROM_APITABLE[1])) ((unsigned long *)(ROM_APITABLE[2]))

ROM rutinok használata A rom rutinok elérése a rom.h segítségével történhet. A rom rutinok használatához a #define TARGET_IS_TEMPEST_RC1 1 fordításidejű konstanst a rom.h hívása előtt definiálni kell. #define ROM_APITABLE #define ROM_VERSION #define ROM_UARTTABLE #define ROM_SSITABLE ((unsigned long *)0x01000010) (ROM_APITABLE[0]) ((unsigned long *)(ROM_APITABLE[1])) ((unsigned long *)(ROM_APITABLE[2])) #if defined(target_is_dustdevil_ra0) \ defined(target_is_tempest_rb1) \ defined(target_is_tempest_rc1) \ defined(target_is_tempest_rc3)

ROM rutinok használata A rom rutinok elérése a rom.h segítségével történhet. A rom rutinok használatához a #define TARGET_IS_TEMPEST_RC1 1 fordításidejű konstanst a rom.h hívása előtt definiálni kell. #define ROM_APITABLE #define ROM_VERSION #define ROM_UARTTABLE #define ROM_SSITABLE ((unsigned long *)0x01000010) (ROM_APITABLE[0]) ((unsigned long *)(ROM_APITABLE[1])) ((unsigned long *)(ROM_APITABLE[2])) #if defined(target_is_dustdevil_ra0) \ defined(target_is_tempest_rb1) \ defined(target_is_tempest_rc1) \ defined(target_is_tempest_rc3) #define ROM_UARTCharPut\ ((void (*)(unsigned long ulbase,\ unsigned char ucdata))rom_uarttable[0])