Problem dotyczy zmiennych 24-bitowych w kompilatorze avr-gcc.
Używam Microchip Studio 7.0.2594 i kompilatora w wersji 7.3.0.
Na potrzeby zaprezentowania problemu napisałem krótki program na mikrokontroler ATtiny10, który uruchamiam w symulatorze.
Wynik kompilacji w oknie "Output" jest poprawny (0 błędów), ale jak się przejdzie do okna "Error List", widać 5 błędów: [N] 3129: unknown type name '__int24'.
Na linijce "asm volatile("nop");" ustawiam Breakpoint.
Oczywiście program w symulacji nie działa prawidłowo. Po najechaniu myszką na zmienną "wynik" wyświetla się komunikat "Unknown type class".
Zmienne 24-bitowe będę wykorzystywał w innym, bardziej zaawansowanym programie.
Nie wiem, jaka jest przyczyna nieprawidłowego działania.
Może potrzeba dołączyć jakąś bibliotekę?
Czy możesz pokazać pełną komendę kompilacji z okna Output albo ustawienia projektu, zwłaszcza wybrany toolchain, standard języka C i poziom optymalizacji?
Invoking: AVR/GNU Linker : 7.3.0
"C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\avr-gcc.exe" -o int24.elf main.o -Wl,-Map="int24.map" -Wl,--start-group -Wl,-lm -Wl,--end-group -Wl,--gc-sections -mmcu=attiny10 -B "C:\Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATtiny_DFP\2.0.368\gcc\dev\attiny10"
Finished building target: int24.elf
"C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\avr-objcopy.exe" -O ihex -R .eeprom -R .fuse -R .lock -R .signature -R .user_signatures "int24.elf" "int24.hex"
"C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\avr-objcopy.exe" -j .eeprom --set-section-flags=.eeprom=alloc,load --change-section-lma .eeprom=0 --no-change-warnings -O ihex "int24.elf" "int24.eep" || exit 0
"C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\avr-objdump.exe" -h -S "int24.elf" > "int24.lss"
"C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\avr-objcopy.exe" -O srec -R .eeprom -R .fuse -R .lock -R .signature -R .user_signatures "int24.elf" "int24.srec"
"C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\avr-size.exe" "int24.elf"
text data bss dec hex filename
210 6 3 219 db int24.elf
Done executing task "RunCompilerTask".
Task "RunOutputFileVerifyTask"
Program Memory Usage : 216 bytes 21,1 % Full
Data Memory Usage : 9 bytes 28,1 % Full
Warning: Memory Usage estimation may not be accurate if there are sections other than .text sections in ELF file
Done executing task "RunOutputFileVerifyTask".
Done building target "CoreBuild" in project "int24.cproj".
Target "PostBuildEvent" skipped, due to false condition; ('$(PostBuildEvent)' != '') was evaluated as ('' != '').
Target "Build" in file "C:\Program Files (x86)\Atmel\Studio\7.0\Vs\Avr.common.targets" from project "C:\Users\Lenovo\Documents\Atmel Studio\7.0\!AVR128DA48_Curiosity_Nano\!Nauka\int24\int24.cproj" (entry point):
Done building target "Build" in project "int24.cproj".
Done building project "int24.cproj".
Build succeeded.
========== Build: 1 succeeded or up-to-date, 0 failed, 0 skipped ==========
Co dokładnie oznacza, że program „nie działa prawidłowo” w symulatorze — jaką wartość ma zmienna
Nie wiem jak sprawdzić wartość zmiennej "wynik" w pamięci. Nie wyświetla się adres komórki pamięci. Tak jakby tej zmiennej nie było.
Używam Microchip Studio 7.0.2594 i kompilatora w wersji 7.3.0.
Na potrzeby zaprezentowania problemu napisałem krótki program na mikrokontroler ATtiny10, który uruchamiam w symulatorze.
Kod: C / C++
Wynik kompilacji w oknie "Output" jest poprawny (0 błędów), ale jak się przejdzie do okna "Error List", widać 5 błędów: [N] 3129: unknown type name '__int24'.
Na linijce "asm volatile("nop");" ustawiam Breakpoint.
Oczywiście program w symulacji nie działa prawidłowo. Po najechaniu myszką na zmienną "wynik" wyświetla się komunikat "Unknown type class".
Zmienne 24-bitowe będę wykorzystywał w innym, bardziej zaawansowanym programie.
Nie wiem, jaka jest przyczyna nieprawidłowego działania.
Może potrzeba dołączyć jakąś bibliotekę?
Czy możesz pokazać pełną komendę kompilacji z okna Output albo ustawienia projektu, zwłaszcza wybrany toolchain, standard języka C i poziom optymalizacji?
Invoking: AVR/GNU Linker : 7.3.0
"C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\avr-gcc.exe" -o int24.elf main.o -Wl,-Map="int24.map" -Wl,--start-group -Wl,-lm -Wl,--end-group -Wl,--gc-sections -mmcu=attiny10 -B "C:\Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATtiny_DFP\2.0.368\gcc\dev\attiny10"
Finished building target: int24.elf
"C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\avr-objcopy.exe" -O ihex -R .eeprom -R .fuse -R .lock -R .signature -R .user_signatures "int24.elf" "int24.hex"
"C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\avr-objcopy.exe" -j .eeprom --set-section-flags=.eeprom=alloc,load --change-section-lma .eeprom=0 --no-change-warnings -O ihex "int24.elf" "int24.eep" || exit 0
"C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\avr-objdump.exe" -h -S "int24.elf" > "int24.lss"
"C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\avr-objcopy.exe" -O srec -R .eeprom -R .fuse -R .lock -R .signature -R .user_signatures "int24.elf" "int24.srec"
"C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\avr-size.exe" "int24.elf"
text data bss dec hex filename
210 6 3 219 db int24.elf
Done executing task "RunCompilerTask".
Task "RunOutputFileVerifyTask"
Program Memory Usage : 216 bytes 21,1 % Full
Data Memory Usage : 9 bytes 28,1 % Full
Warning: Memory Usage estimation may not be accurate if there are sections other than .text sections in ELF file
Done executing task "RunOutputFileVerifyTask".
Done building target "CoreBuild" in project "int24.cproj".
Target "PostBuildEvent" skipped, due to false condition; ('$(PostBuildEvent)' != '') was evaluated as ('' != '').
Target "Build" in file "C:\Program Files (x86)\Atmel\Studio\7.0\Vs\Avr.common.targets" from project "C:\Users\Lenovo\Documents\Atmel Studio\7.0\!AVR128DA48_Curiosity_Nano\!Nauka\int24\int24.cproj" (entry point):
Done building target "Build" in project "int24.cproj".
Done building project "int24.cproj".
Build succeeded.
========== Build: 1 succeeded or up-to-date, 0 failed, 0 skipped ==========
Co dokładnie oznacza, że program „nie działa prawidłowo” w symulatorze — jaką wartość ma zmienna
wynik, jaka jest oczekiwana wartość oraz czy sprawdzałeś wartość w pamięci/rejestrach, a nie tylko przez podgląd zmiennej w debuggerze?
Nie wiem jak sprawdzić wartość zmiennej "wynik" w pamięci. Nie wyświetla się adres komórki pamięci. Tak jakby tej zmiennej nie było.