Witam,
Programuję w C Atmege8 za pomocą AVR Studio 4.14 i WinAVR 20080610. W funkcji main() po kilku podstawowych operacjach typu ustawienie kierunku portów chcę wywołać funkcję która na razie nic nie zwraca:
Okazuje się że po wywołaniu tej funkcji w dalszej części programu mikrokontroler się zawiesza (a na pewno nie wykonuje dalszych poleceń), wykonuje tylko przerwania związane z obsługą wyświetlacza.
Po skompilowaniu oglądam sobie Disassemblerem co z tego wychodzi, i oto wynik (tylko funkcja main):
Widać że kompilator zakończył main pustą pętlą, jednak w moim kodzie są dalej jeszcze polecenia. Gdy wyłączę optymalizację, sytuacja się poprawia i powstaje poprawny assembler, jednak już przy bardzo prostym programie potrzeba większości zasobów ATmegi, a w planach mam jeszcze sporo kodu. Czy ktoś wie jak obejść ten problem? Nadmienię, że nie jest to fikcyjny problem obserwowany tylko w disassemblerze, ale mikrokontroler faktycznie tak się zachowuje. Wiem że pisanie w asmie było by dużo oszczędniejsze i dałoby lepszą kontrolę nad kodem, ale naprawdę mam swoje powody by pisać w C.
Pozdrawiam i czekam na pomoc,
Mateusz K.
Programuję w C Atmege8 za pomocą AVR Studio 4.14 i WinAVR 20080610. W funkcji main() po kilku podstawowych operacjach typu ustawienie kierunku portów chcę wywołać funkcję która na razie nic nie zwraca:
unsigned char ResetPulse(){
return 0;
}
Okazuje się że po wywołaniu tej funkcji w dalszej części programu mikrokontroler się zawiesza (a na pewno nie wykonuje dalszych poleceń), wykonuje tylko przerwania związane z obsługą wyświetlacza.
Po skompilowaniu oglądam sobie Disassemblerem co z tego wychodzi, i oto wynik (tylko funkcja main):
---- main.c ---------------------------------------------------------------------------------------
9: int main(void){
+0000002F: D00D RCALL PC+0x000E Relative call subroutine
11: INITIALIZE_1WIRE;
+00000030: 9A89 SBI 0x11,1 Set bit in I/O register
+00000031: 9A91 SBI 0x12,1 Set bit in I/O register
13: ucDigit1_char = 20;
+00000032: E184 LDI R24,0x14 Load immediate
+00000033: 9380007B STS 0x007B,R24 Store direct to data space
14: ucDigit2_char = 20;
+00000035: 93800078 STS 0x0078,R24 Store direct to data space
15: ucDigit3_char = 20;
+00000037: 93800079 STS 0x0079,R24 Store direct to data space
16: ucBlink = 0;
+00000039: 9210007A STS 0x007A,R1 Store direct to data space
21: ucResetResult = ResetPulse();
+0000003B: D0D6 RCALL PC+0x00D7 Relative call subroutine
+0000003C: CFFF RJMP PC-0x0000
Widać że kompilator zakończył main pustą pętlą, jednak w moim kodzie są dalej jeszcze polecenia. Gdy wyłączę optymalizację, sytuacja się poprawia i powstaje poprawny assembler, jednak już przy bardzo prostym programie potrzeba większości zasobów ATmegi, a w planach mam jeszcze sporo kodu. Czy ktoś wie jak obejść ten problem? Nadmienię, że nie jest to fikcyjny problem obserwowany tylko w disassemblerze, ale mikrokontroler faktycznie tak się zachowuje. Wiem że pisanie w asmie było by dużo oszczędniejsze i dałoby lepszą kontrolę nad kodem, ale naprawdę mam swoje powody by pisać w C.
Pozdrawiam i czekam na pomoc,
Mateusz K.
