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])