W programie C, który nie korzysta z rekursji, teoretycznie powinno być możliwe obliczenie maksymalnego/najgorszego rozmiaru stosu potrzebnego do wywołania danej funkcji i wszystkiego, co jest potrzebne. to wywołuje. Czy są jakieś darmowe narzędzia open source, które mogą to zrobić, albo z kodu źródłowego, albo ze skompilowanych plików ELF?Maksymalny rozmiar stosu potrzebny dla programu C na MSP430
Czy istnieje sposób na wyodrębnienie rozmiaru ramki stosu funkcji z pliku ELF, aby można było spróbować go rozwiązać ręcznie?
Kompiluję dla MSP430 używając MSPGCC 3.2.3 (wiem, że to stara wersja, ale muszę w tym przypadku użyć). Miejsce na stos do przydzielenia jest ustawione w kodzie źródłowym i powinno być tak małe, jak to tylko możliwe, aby reszta pamięci mogła być wykorzystana do innych celów. Czytałem, że musisz wziąć pod uwagę przestrzeń stosu używaną przez przerwań, ale system, którego używam, już to uwzględnia - staram się ustalić, ile dodatkowego miejsca należy dodać. Ponadto, czytałem, że wskaźniki funkcji utrudniają to. W tych kilku miejscach, w których są używane wskaźniki funkcji, wiem, które funkcje mogą wywoływać, więc można wziąć pod uwagę te przypadki ręcznie, jeśli przestrzeń stosu potrzebna dla wywoływanych funkcji i funkcji wywołujących była znana.
Analiza statyczna wydaje się bardziej niezawodną opcją niż malowanie w stosie w środowisku wykonawczym, ale praca w środowisku wykonawczym jest opcją, jeśli nie ma sposobu, aby zrobić to statycznie.
Edit:
znalazłem GCC -fstack-usage
flagę, która oszczędza rozmiar ramki dla każdej funkcji, ponieważ jest skompilowany. Niestety, MSPGCC nie obsługuje tego. Ale może być przydatny dla każdego, kto próbuje zrobić coś podobnego na innej platformie.
Czy to naprawdę jest sposób na rozwiązanie problemu? Zawsze byłem dość hojny przy stosie i chroniłem go kanarkami stosu, aby zobaczyć, że jest nienaruszony. Głównym problemem związanym z tym podejściem jest to, że może to powodować problemy później. Takich jak wtedy, gdy potrzebujesz większej pamięci programu, powiedzmy, 24-bitowy komputer zamiast 16 (teraz tylko ogólne 8-bitowe doświadczenie), lub potrzebujesz tylko kilku dodatkowych funkcji najlepiej zrealizowanych z dodatkowymi warstwami połączeń. Wtedy precyzyjnie ustawiony stos może naprawdę cię odzyskać. Oczywiście, jeśli wyciskasz ostatnie bity, to OK, ale myślę, że to powinno być ostatnie. – Jubatian
"Czy są dostępne darmowe narzędzia o otwartym kodzie źródłowym". Dostępna jest darmowa wersja (nie otwartego pliku) IAR IDE (przez 30 dni lub limit kodu 4K), w której opcja listy linkerów generuje zużycie stosu dla aplikacji. Nawet jeśli używasz GCC, do uzyskania szczegółowych informacji, takich jak Rozmiar stosu (suma i dla każdej funkcji), rozmiar kodu (suma i dla każdej funkcji) i inne szczegóły, takie jak rozmieszczenie pamięci i zmienne adresy i rozmiary itp., Możesz użyć IAR Wbudowany pulpit. – Harikrishnan
możliwy duplikat [Sprawdzanie użycia stosu podczas kompilacji] (http://stackoverflow.com/questions/126036/checking-stack-usage-at-compile-time) – shodanex