|
From: | Alistair Gadd |
Subject: | [avr-gcc-list] In-line Assembler Code |
Date: | Sat, 07 Mar 2015 17:07:55 +0200 |
User-agent: | Mozilla/5.0 (Windows NT 5.2; WOW64; rv:31.0) Gecko/20100101 Thunderbird/31.5.0 |
Hi Guys,
I'm trying to use GCC-AVR to set up the clock prescale on an ATmega32U4, using the clock_prescale_set() function as outlined in the "avr/power.h " header file. If I call: clock_prescale_set(clock_div_1) or clock_prescale_set(0); where clock_prescale_set is defined in "avr/power.h" as follows: typedef enum { clock_div_1 = 0, clock_div_2 = 1, clock_div_4 = 2, clock_div_8 = 3, clock_div_16 = 4, clock_div_32 = 5, clock_div_64 = 6, clock_div_128 = 7, clock_div_256 = 8 #if defined(__AVR_ATmega128RFA1__) \ || defined(__AVR_ATmega256RFR2__) \ || defined(__AVR_ATmega2564RFR2__) \ || defined(__AVR_ATmega128RFR2__) \ || defined(__AVR_ATmega1284RFR2__) \ || defined(__AVR_ATmega64RFR2__) \ || defined(__AVR_ATmega644RFR2__) , clock_div_1_rc = 15 #endif } clock_div_t; void clock_prescale_set(clock_div_t __x) { uint8_t __tmp = _BV(CLKPCE); __asm__ __volatile__ ( "in __tmp_reg__,__SREG__" "\n\t" "cli" "\n\t" "sts %1, %0" "\n\t" "sts %1, %2" "\n\t" "out __SREG__, __tmp_reg__" : /* no outputs */ : "d" (__tmp), "M" (_SFR_MEM_ADDR(CLKPR)), "d" (__x) : "r0"); } I get the following in-line assembler generated (.lss file extract): void clock_prescale_set(clock_div_t __x) { uint8_t __tmp = _BV(CLKPCE); __asm__ __volatile__ ( 12a: 90 e0 ldi r25, 0x00 ; 0 12c: 80 e8 ldi r24, 0x80 ; 128 12e: 0f b6 in r0, 0x3f ; 63 130: f8 94 cli 132: 80 93 61 00 sts 0x0061, r24 136: 90 93 61 00 sts 0x0061, r25 13a: 0f be out 0x3f, r0 ; 63 which I can understand, but if I call: clock_prescale_set(clock_div_4); or: clock_prescale_set(2); I get exactly the same code generated, in other words: void clock_prescale_set(clock_div_t __x) { uint8_t __tmp = _BV(CLKPCE); __asm__ __volatile__ ( 12a: 90 e0 ldi r25, 0x00 ; 0 12c: 80 e8 ldi r24, 0x80 ; 128 12e: 0f b6 in r0, 0x3f ; 63 130: f8 94 cli 132: 80 93 61 00 sts 0x0061, r24 136: 90 93 61 00 sts 0x0061, r25 13a: 0f be out 0x3f, r0 ; 63 where I would expect to get this: void clock_prescale_set(clock_div_t __x) { uint8_t __tmp = _BV(CLKPCE); __asm__ __volatile__ ( 12a: 90 e0 ldi r25, 0x02 ; 0 12c: 80 e8 ldi r24, 0x80 ; 128 12e: 0f b6 in r0, 0x3f ; 63 130: f8 94 cli 132: 80 93 61 00 sts 0x0061, r24 136: 90 93 61 00 sts 0x0061, r25 13a: 0f be out 0x3f, r0 ; 63 I don't get any compilation errors, so I think it sees the enum okay and the assembly listing is fresh each time I try. I'm sure I must be doing something simplisticly crazy, but I think I need help, because this is driving me nuts and it's been a long day. I'm used to using separate assembler files and I'm not a great boffin on using in-line assembly, but I really think I need to get a collar on it. Many thanks to whoever can help, best regards, Alistair. PS: My tool set versions are as follows:: Atmel Studio 6 (Version: 6.2.1153 - )© 2014 Atmel Corp. All rights reserved. OS Version: Microsoft Windows NT 5.2.3790 Service Pack 2 Platform: Win32NT Installed Packages: Shell VSIX manifest - 6.2 Shell VSIX manifest Version: 6.2 Package GUID: 5aa6ea3e-da7b-48c1-9b2a-cab2329d32ac Company: Atmel Corporation Installed Packages: Atmel ARM GNU Toolchain - 4.8.3.1429 ARM Toolchain Version: ARM_Toolchain_Version:4.8.3.277 GCC_VERSION:4.8.3 Package GUID: D83C9208-1D2D-4665-9760-EB9EE264CF8F Company: Atmel HelpUrl: Release Description: ARM Toolchain CMSIS Version: 3.20 Package GUID: D83C9208-1D2D-4665-9760-EB9EE264CF8F Company: Atmel HelpUrl: Release Description: ARM Support File Version Installed Packages: AVR macro Assembler - 2.1.39.1117 AVR Assembler Version: 2.1.39.232 Package GUID: 03CB4AE1-80EA-40C7-B561-98CC87EA539C Company: Atmel HelpUrl: Release Description: AVR Assembler For 8-Bit Devices Installed Packages: Atmel AVR (32 bit) GNU Toolchain - 3.4.2.1057 AVR Toolchain 32 Version: AVR32_Toolchain_Version:3.4.2.435 GCC_VERSION:4.4.7 Package GUID: DB6D383F-C5D9-4E7E-BBF9-F37C6EEB59FD Company: Atmel HelpUrl: Release Description: AVR Toolchain For 32-Bit Devices Installed Packages: Atmel AVR (8 bit) GNU Toolchain - 3.4.4.1056 AVR Toolchain 8 Bit Version: AVR8_Toolchain_Version:3.4.4.1229 GCC_VERSION:4.8.1 Package GUID: 2C7AA7CF-94C6-463C-81DA-4AA03B613C3B Company: Atmel HelpUrl: Release Description: AVR Toolchain For 8-Bit Devices Installed Packages: Atmel Gallery - 1.3.1 Atmel Gallery Version: 1.3.1 Package GUID: AtmelStudioExtensionManager Company: Atmel Installed Packages: Atmel Software Framework - 3.21.0.1353 ASF Version: 3.21.0 Package GUID: 1E567EA3-6E83-4C11-8734-684F4581B25D Company: Atmel HelpUrl: http://asf.atmel.com/3.21.0 Release Description: ASF - 3.21.0 Release ASF Version: 3.20.1 Package GUID: 1E567EA3-6E83-4C11-8734-684F4581B25D Company: Atmel HelpUrl: http://asf.atmel.com/3.20.1 Release Description: ASF - 3.20.1 Release ASF Version: 3.19.0 Package GUID: 1E567EA3-6E83-4C11-8734-684F4581B25D Company: Atmel HelpUrl: http://asf.atmel.com/3.19.0 Release Description: ASF - 3.19.0 Release ASF Version: 3.18.1 Package GUID: 1E567EA3-6E83-4C11-8734-684F4581B25D Company: Atmel HelpUrl: http://asf.atmel.com/3.18.1 Release Description: ASF - 3.18.1 Release ASF Version: 3.18.0 Package GUID: 1E567EA3-6E83-4C11-8734-684F4581B25D Company: Atmel HelpUrl: http://asf.atmel.com/3.18.0 Release Description: ASF - 3.18.0 Release ASF Version: 3.17.0 Package GUID: 1E567EA3-6E83-4C11-8734-684F4581B25D Company: Atmel HelpUrl: http://asf.atmel.com/3.17.0 Release Description: ASF - 3.17.0 Release ASF Version: 3.16.0 Package GUID: 1E567EA3-6E83-4C11-8734-684F4581B25D Company: Atmel HelpUrl: http://asf.atmel.com/3.16.0 Release Description: ASF - 3.16.0 Release ASF Version: 3.15.0 Package GUID: 1E567EA3-6E83-4C11-8734-684F4581B25D Company: Atmel HelpUrl: http://asf.atmel.com/3.15.0 Release Description: ASF - 3.15.0 Release ASF Version: 3.14.0 Package GUID: 1E567EA3-6E83-4C11-8734-684F4581B25D Company: Atmel HelpUrl: http://asf.atmel.com/3.14.0 Release Description: ASF - 3.14.0 Release ASF Version: 3.13.1 Package GUID: 1E567EA3-6E83-4C11-8734-684F4581B25D Company: Atmel HelpUrl: http://asf.atmel.com/3.13.1 Release Description: ASF - 3.13.1 Release ASF Version: 3.12.1 Package GUID: 1E567EA3-6E83-4C11-8734-684F4581B25D Company: Atmel HelpUrl: http://asf.atmel.com/3.12.1 Release Description: ASF - 3.12.1 Release ASF Version: 3.11.0 Package GUID: 1E567EA3-6E83-4C11-8734-684F4581B25D Company: Atmel HelpUrl: http://asf.atmel.com/3.11.0 Release Description: ASF - 3.11.0 Release ASF Version: 3.10.1 Package GUID: 1E567EA3-6E83-4C11-8734-684F4581B25D Company: Atmel HelpUrl: http://asf.atmel.com/3.10.1 Release Description: ASF - 3.10.1 Release Installed Packages: Atmel Kits - 1.7.291 Atmel Kits Version: 1.7.291 Package GUID: B624D6C6-CB86-4887-A57F-327D248085A9 Company: Atmel Installed Packages: AtmelToolchainProvider - 6.2.666 AtmelToolchainProvider Version: 6.2.666 Package GUID: AtmelToolchainProvider.Atmel.0780A430-065B-4EFD-B0D1-FC957262E6DF Company: Atmel Installed Packages: LiveWatch - 1.4.306 LiveWatch Version: 1.4.306 Package GUID: 07290e21-75bd-4363-8d07-a5fa8e32876e Company: Atmel Installed Packages: MemoryLogger - 6.2.167 MemoryLogger Version: 6.2.167 Package GUID: 99A2A244-8218-4868-A0D1-A1683E6FCC53 Company: Atmel Installed Packages: Percepio Trace for Atmel Studio - 1.0 Percepio Trace for Atmel Studio Version: 1.0 Package GUID: fe274744-c496-42fc-9e52-f77b92d669b1 Company: Percepio AB Installed Packages: Visual Assist for Atmel Studio - 10.8.2023.3 Visual Assist for Atmel Studio Version: 10.8.2023.3 Package GUID: 7997A33C-B154-4b75-B2AC658CD58C9510 Company: Whole Tomato Software Installed Packages: GdbConsole - 1.0 GdbConsole Version: 1.0 Package GUID: d616f47a-811f-4a7e-bcb8-8fe696222d92 Company: Atmel |
[Prev in Thread] | Current Thread | [Next in Thread] |