From bb14dd4c2220a6494e5a37f20a89bcf28b7084e9 Mon Sep 17 00:00:00 2001 From: Martin Preuss Date: Sun, 1 Jun 2025 19:18:25 +0200 Subject: [PATCH] introduce macros bigjmp and bigcall for intermodule calls/jmps translates to rjmp/rcall on MCUs with up to 8K flash and to jmp/call on others. --- avr/apps/network/main.asm | 6 +- avr/apps/stats/main.asm | 2 +- avr/common/calls.asm | 30 +++++++++ avr/common/debug.asm | 2 +- avr/devices/all/apps.asm | 16 ++--- avr/devices/all/main.asm | 77 +++++++++++------------ avr/devices/all/modules.asm | 82 ++++++++++++------------- avr/modules/bootloader/main.asm | 3 +- avr/modules/network/msg/device-w.asm | 2 +- avr/modules/network/msg/recvstats-w.asm | 2 +- avr/modules/network/msg/sendstats-w.asm | 2 +- 11 files changed, 128 insertions(+), 96 deletions(-) create mode 100644 avr/common/calls.asm diff --git a/avr/apps/network/main.asm b/avr/apps/network/main.asm index fc1d3b5..d440e20 100644 --- a/avr/apps/network/main.asm +++ b/avr/apps/network/main.asm @@ -164,7 +164,7 @@ appNetworkHandleRebootRequest: brcc appNetworkHandleRebootRequest_end ; reboot cli - rjmp BOOTLOADER_ADDR + bigjmp BOOTLOADER_ADDR appNetworkHandleRebootRequest_end: ret ; @end @@ -249,7 +249,7 @@ appNetworkHandleStateHaveAddress2: cli ldi xl, LOW(EEPROM_OFFS_COMADDR) ldi xh, HIGH(EEPROM_OFFS_COMADDR) - rcall Utils_WriteEepromIncr ; write address to EEPROM + bigcall Utils_WriteEepromIncr ; write address to EEPROM out SREG, r15 pop r15 appNetworkHandleStateHaveAddress2_end: @@ -451,7 +451,7 @@ appNetworkGetAddressFromEeprom: cli ldi xl, LOW(EEPROM_OFFS_COMADDR) ldi xh, HIGH(EEPROM_OFFS_COMADDR) - rcall Utils_ReadEepromIncr ; (R16) + bigcall Utils_ReadEepromIncr ; (R16) out SREG, r15 pop r15 ret diff --git a/avr/apps/stats/main.asm b/avr/apps/stats/main.asm index 0d05743..45b9091 100644 --- a/avr/apps/stats/main.asm +++ b/avr/apps/stats/main.asm @@ -162,7 +162,7 @@ appStatsSend16BitValue: ldi r20, 1 clr r21 ldi r22, AQHOME_VALUETYPE_STATS - rjmp Main_SendValueReport + bigjmp Main_SendValueReport ; @end diff --git a/avr/common/calls.asm b/avr/common/calls.asm new file mode 100644 index 0000000..7bde9ab --- /dev/null +++ b/avr/common/calls.asm @@ -0,0 +1,30 @@ +; *************************************************************************** +; copyright : (C) 2025 by Martin Preuss +; email : martin@libchipcard.de +; +; *************************************************************************** +; * This file is part of the project "AqHome". * +; * Please see toplevel file COPYING of that project for license details. * +; *************************************************************************** + + + +.macro bigcall +.if FLASHEND >= 0x1000 + call @0 +.else + rcall @0 +.endif +.endmacro + + +.macro bigjmp +.if FLASHEND >= 0x1000 + jmp @0 +.else + rjmp @0 +.endif +.endmacro + + + diff --git a/avr/common/debug.asm b/avr/common/debug.asm index edfce93..110c5f3 100644 --- a/avr/common/debug.asm +++ b/avr/common/debug.asm @@ -74,7 +74,7 @@ waitFor10ms: ldi r22, 100 waitFor10ms_loop: push r22 - rcall Utils_WaitFor100MicroSecs + bigcall Utils_WaitFor100MicroSecs pop r22 dec r22 brne waitFor10ms_loop diff --git a/avr/devices/all/apps.asm b/avr/devices/all/apps.asm index 8940bef..4ed10ef 100644 --- a/avr/devices/all/apps.asm +++ b/avr/devices/all/apps.asm @@ -26,27 +26,27 @@ initApps: #ifdef APPS_NETWORK ldi yl, LOW(netInterfaceData) ldi yh, HIGH(netInterfaceData) - rcall AppNetwork_Init + bigcall AppNetwork_Init #endif #ifdef APPS_MOTION - rcall AppMotion_Init + bigcall AppMotion_Init #endif #ifdef APPS_DOOR - rcall AppDoor_Init + bigcall AppDoor_Init #endif #ifdef APPS_REPORTSENSORS - rcall AppReportSensors_Init + bigcall AppReportSensors_Init #endif #ifdef APPS_STATS - rcall AppStats_Init + bigcall AppStats_Init #endif #ifdef APPS_MA_LIGHT - rcall AppMotionLight_Init + bigcall AppMotionLight_Init #endif ; done @@ -78,11 +78,11 @@ mainAppsOnPacketReceived: ; handle messages ldi yl, LOW(netInterfaceData) ldi yh, HIGH(netInterfaceData) - rcall AppNetwork_HandleMsg + bigcall AppNetwork_HandleMsg #endif #ifdef APPS_MA_LIGHT - rcall AppMotionLight_OnPacketReceived + bigcall AppMotionLight_OnPacketReceived #endif ; add more here diff --git a/avr/devices/all/main.asm b/avr/devices/all/main.asm index 31ed484..6faf1a1 100644 --- a/avr/devices/all/main.asm +++ b/avr/devices/all/main.asm @@ -8,6 +8,7 @@ ; *************************************************************************** + ; *************************************************************************** ; code @@ -31,16 +32,16 @@ main: ; rcall watchdogOff ; turn off watchdog timer (sometimes it stays on after reboot) - rcall systemSetSpeed - rcall systemInitHardware - rcall Utils_Init - rcall Utils_SetupUid - rcall initModules - rcall initApps - rcall Utils_InitialWait + bigcall systemSetSpeed + bigcall systemInitHardware + bigcall Utils_Init + bigcall Utils_SetupUid + bigcall initModules + bigcall initApps + bigcall Utils_InitialWait sei ; Enable interrupts - rcall onSystemStart + bigcall onSystemStart #ifdef MODULES_LED ldi xl, LOW(blinkPattern) ; debug: set blink pattern @@ -53,11 +54,11 @@ main: #endif main_loop: - rcall systemSleep ; system-dependant - rcall runModules - rcall runApps + bigcall systemSleep ; system-dependant + bigcall runModules + bigcall runApps - rcall onEveryLoop ; call into main app + bigcall onEveryLoop ; call into main app #ifdef MODULES_NETWORK #ifndef MAIN_WITHOUT_MSG_HANDLING @@ -69,7 +70,7 @@ main_loop: main_loop_reboot: cli - rjmp BOOTLOADER_ADDR + bigjmp BOOTLOADER_ADDR ; @end @@ -80,53 +81,53 @@ main_loop_reboot: ; Called every 100ms. No arguments, no results. onSystemTimerTick: - rcall onEvery100ms + bigcall onEvery100ms #ifdef MODULES_CLOCK - rcall Clock_Every100ms ; generates calls to onEverySecond/Minute/Hour/Day + bigcall Clock_Every100ms ; generates calls to onEverySecond/Minute/Hour/Day #endif #ifdef MODULES_LED_SIMPLE - rcall LedSimple_Every100ms + bigcall LedSimple_Every100ms #endif #ifdef MODULES_UART_BITBANG - rcall UART_BitBang_Every100ms + bigcall UART_BitBang_Every100ms #endif #ifdef MODULES_UART_HW - rcall NET_Uart_Every100ms + bigcall NET_Uart_Every100ms #endif #ifdef MODULES_TTYONUART1 - rcall TtyOnUart1_Periodically + bigcall TtyOnUart1_Periodically #endif #ifdef MODULES_COMONUART0 - rcall ComOnUart0_Periodically + bigcall ComOnUart0_Periodically #endif #ifdef MODULES_TCRT1000 - rcall TCRT1K_Every100ms + bigcall TCRT1K_Every100ms #endif #ifdef APPS_NETWORK ldi yl, LOW(netInterfaceData) ldi yh, HIGH(netInterfaceData) - rcall AppNetwork_Every100ms + bigcall AppNetwork_Every100ms #endif #ifdef APPS_MOTION - rcall AppMotion_Every100ms + bigcall AppMotion_Every100ms #endif #ifdef APPS_DOOR - rcall AppDoor_Every100ms + bigcall AppDoor_Every100ms #endif #ifdef APPS_MA_LIGHT - rcall AppMotionLight_Every100ms + bigcall AppMotionLight_Every100ms #endif ret @@ -138,32 +139,32 @@ onSystemTimerTick: sysOnEverySecond: #ifdef MODULES_DS18B20 - rcall Ds18b20_OnEverySecond + bigcall Ds18b20_OnEverySecond #endif #ifdef APPS_REPORTSENSORS - rcall AppReportSensors_OnEverySecond + bigcall AppReportSensors_OnEverySecond #endif - rjmp onEverySecond + bigjmp onEverySecond ; @end sysOnEveryMinute: #ifdef APPS_STATS - rcall AppStats_OnEveryMinute + bigcall AppStats_OnEveryMinute #endif - rjmp onEveryMinute + bigjmp onEveryMinute ; @end sysOnEveryHour: - rjmp onEveryHour + bigjmp onEveryHour ; @end sysOnEveryDay: - rjmp onEveryDay + bigjmp onEveryDay ; @end #endif @@ -175,17 +176,17 @@ sysOnEveryDay: ; @routine mainHandleMessages mainHandleMessages: - rcall NET_GetNextIncomingMsgNum ; R16=msg num + bigcall NET_GetNextIncomingMsgNum ; R16=msg num brcc mainHandleMessages_end - rcall NET_Buffer_Locate ; X=buffer addr (R17) + bigcall NET_Buffer_Locate ; X=buffer addr (R17) adiw xh:xl, 1 push r16 - rcall onMessageReceived - rcall mainModulesOnPacketReceived - rcall mainAppsOnPacketReceived + bigcall onMessageReceived + bigcall mainModulesOnPacketReceived + bigcall mainAppsOnPacketReceived pop r16 - rcall NET_Buffer_ReleaseByNum + bigcall NET_Buffer_ReleaseByNum sec mainHandleMessages_end: ret diff --git a/avr/devices/all/modules.asm b/avr/devices/all/modules.asm index c45ba91..bb63e77 100644 --- a/avr/devices/all/modules.asm +++ b/avr/devices/all/modules.asm @@ -22,22 +22,22 @@ ; Call init functions of the used modules. Add your routine calls here. initModules: - rcall BaseTimer_Init ; unconditionally call this + bigcall BaseTimer_Init ; unconditionally call this #ifdef MODULES_HEAP - rcall Heap_Init + bigcall Heap_Init #endif #ifdef MODULES_CLOCK - rcall Clock_Init + bigcall Clock_Init #endif #ifdef MODULES_TIMER - rcall Timer_Init + bigcall Timer_Init #endif #ifdef MODULES_XRAM - rcall XRAM_Init + bigcall XRAM_Init #endif #ifdef MODULES_LED @@ -45,107 +45,107 @@ initModules: ldi zh, HIGH(ledA3Flash) ldi yl, LOW(ledA3Sram) ldi yh, HIGH(ledA3Sram) - rcall Led_Init + bigcall Led_Init #endif #ifdef MODULES_LED_SIMPLE - rcall LedSimple_Init + bigcall LedSimple_Init #endif #ifdef MODULES_COM - rcall Com2_Init ; init COM module - rcall CPRO_Init ; init COM protocol module + bigcall Com2_Init ; init COM module + bigcall CPRO_Init ; init COM protocol module #endif #ifdef MODULES_NETWORK - rcall NET_Init + bigcall NET_Init #endif #ifdef MODULES_UART_BITBANG - rcall UART_BitBang_Init + bigcall UART_BitBang_Init #endif #ifdef MODULES_UART_HW - rcall NET_Uart_Init + bigcall NET_Uart_Init #endif #ifdef MODULES_TTYONUART1 - rcall TtyOnUart1_Init + bigcall TtyOnUart1_Init #endif #ifdef MODULES_COMONUART0 - rcall ComOnUart0_Init + bigcall ComOnUart0_Init #endif #ifdef MODULES_MOTION - rcall Motion_Init + bigcall Motion_Init #endif #ifdef MODULES_TWI_MASTER - rcall TWI_Master_Init + bigcall TWI_Master_Init #endif #ifdef MODULES_OWI_MASTER - rcall OwiMaster_Init + bigcall OwiMaster_Init #endif #ifdef MODULES_SPI_HW - rcall SPIHW_Init + bigcall SPIHW_Init #endif #ifdef MODULES_LCD - rcall LCD_Init + bigcall LCD_Init #endif #ifdef MODULES_BMP280 - rcall BMP280_Init + bigcall BMP280_Init #endif #ifdef MODULES_SI7021 - rcall SI7021_Init + bigcall SI7021_Init #endif #ifdef MODULES_SGP30 - rcall SGP30_Init + bigcall SGP30_Init #endif #ifdef MODULES_SGP40 - rcall SGP40_Init + bigcall SGP40_Init #endif #ifdef MODULES_DS18B20 - rcall Ds18b20_Init + bigcall Ds18b20_Init #endif #ifdef MODULES_STATS - rcall Stats_Init + bigcall Stats_Init #endif #ifdef MODULES_CNY70 - rcall CNY70_Init + bigcall CNY70_Init #endif #ifdef MODULES_REED - rcall REED_Init + bigcall REED_Init #endif #ifdef MODULES_SK6812 - rcall SK6812_Init + bigcall SK6812_Init #endif #ifdef MODULES_MOTION_LIGHT - rcall MotionLight_Init + bigcall MotionLight_Init #endif #ifdef MODULES_TCRT1000 - rcall TCRT1K_Init + bigcall TCRT1K_Init #endif #ifdef MODULES_CCS811 - rcall CCS811_Init + bigcall CCS811_Init #endif #ifdef MODULES_ILI9341 - rcall ILI9341_Init + bigcall ILI9341_Init #endif @@ -167,14 +167,14 @@ initModules: ; USED: depending on called routines runModules: - rcall BaseTimer_Run + bigcall BaseTimer_Run #ifdef MODULES_COM ; COM module (call until carry flag cleared but at most 10 times to not starve other modules) ldi r16, 10 runModules_Com: push r16 - rcall Com2_Run + bigcall Com2_Run pop r16 brcc runModules_ComEnd dec r16 @@ -183,23 +183,23 @@ runModules_ComEnd: #endif #ifdef MODULES_TTYONUART1 - rcall TtyOnUart1_Run + bigcall TtyOnUart1_Run #endif #ifdef MODULES_COMONUART0 - rcall ComOnUart0_Run + bigcall ComOnUart0_Run #endif #ifdef MODULES_STATS - rcall Stats_Run + bigcall Stats_Run #endif #ifdef MODULES_REED - rcall REED_Run + bigcall REED_Run #endif #ifdef MODULES_CNY70 - rcall CNY70_Run + bigcall CNY70_Run #endif #ifdef MODULES_MOTION_LIGHT @@ -220,12 +220,12 @@ runModules_ComEnd: mainModulesOnPacketReceived: #ifdef MODULES_SK6812 - rcall SK6812_OnPacketReceived + bigcall SK6812_OnPacketReceived #endif #ifdef MODULES_LED_SIMPLE #ifdef MODULES_NETWORK - rcall LedSimple_OnPacketReceived + bigcall LedSimple_OnPacketReceived #endif #endif diff --git a/avr/modules/bootloader/main.asm b/avr/modules/bootloader/main.asm index 6bdf87a..2456c2a 100644 --- a/avr/modules/bootloader/main.asm +++ b/avr/modules/bootloader/main.asm @@ -70,7 +70,8 @@ bootLoader_startFirmware: ldi r20, 4 ; on time ldi r21, 1 ; off time rcall bootLoaderBlinkLed - rjmp firmwareStart + bigjmp firmwareStart + bootLoader_waitAndRestartBootLoader: ldi r19, 3 ; loop count ldi r20, 1 ; on time diff --git a/avr/modules/network/msg/device-w.asm b/avr/modules/network/msg/device-w.asm index b41c66c..a1e7ec2 100644 --- a/avr/modules/network/msg/device-w.asm +++ b/avr/modules/network/msg/device-w.asm @@ -29,7 +29,7 @@ NETMSG_Device_Write: ldi zh, HIGH(devInfoBlock*2) ; 6-17: devInfoBlock ldi zl, LOW(devInfoBlock*2) ldi r18, 12 - rcall Utils_CopyFromFlash ; (R17, R18, X, Z) + bigcall Utils_CopyFromFlash ; (R17, R18, X, Z) sbiw xh:xl, 20 ; go back to beginning of message (1 byte dst addr, 1 byte length, 18 bytes payload) rcall NETMSG_CalcAndAddChecksumByte ; (R16, R17, R18, R19, R20, X) sbiw xh:xl, 21 ; go back to beginning of message (1 byte dst addr, 1 byte length, 18 bytes payload, 1 byte crc) diff --git a/avr/modules/network/msg/recvstats-w.asm b/avr/modules/network/msg/recvstats-w.asm index 60ab75f..d170d74 100644 --- a/avr/modules/network/msg/recvstats-w.asm +++ b/avr/modules/network/msg/recvstats-w.asm @@ -28,7 +28,7 @@ NETMSG_RecvStats_Write: rcall NETMSG_Common_AddUidToBuffer ; (R16, R18, R19, R20, R21) adiw yh:yl, NET_IFACE_OFFS_PACKETSIN_LOW ldi r18, 12 - rcall Utils_Copy_SDRAM ; (R17, R18, X, Y) + bigcall Utils_Copy_SDRAM ; (R17, R18, X, Y) sbiw yh:yl, NET_IFACE_OFFS_PACKETSIN_LOW+12 sbiw xh:xl, 20 ; go back to beginning of message (1 byte dst addr, 1 byte length, 18 bytes payload) diff --git a/avr/modules/network/msg/sendstats-w.asm b/avr/modules/network/msg/sendstats-w.asm index 5ad7d9f..f33d612 100644 --- a/avr/modules/network/msg/sendstats-w.asm +++ b/avr/modules/network/msg/sendstats-w.asm @@ -28,7 +28,7 @@ NETMSG_SendStats_Write: rcall NETMSG_Common_AddUidToBuffer ; (R16, R18, R19, R20, R21) adiw yh:yl, NET_IFACE_OFFS_PACKETSOUT_LOW ldi r18, 6 - rcall Utils_Copy_SDRAM ; (R17, R18, X, Y) + bigcall Utils_Copy_SDRAM ; (R17, R18, X, Y) sbiw yh:yl, NET_IFACE_OFFS_PACKETSOUT_LOW+6 sbiw xh:xl, 14 ; go back to beginning of message (1 byte dst addr, 1 byte length, 12 bytes payload)