Zacząłem pisać oprogramowanie układowe dla mojego produktu i jestem tutaj debiutantem. Przejrzałem wiele artykułów na temat niestosowania zmiennych globalnych lub funkcji. Czy jest jakiś limit używania zmiennych globalnych w systemie 8-bitowym, czy też jest to kompletne „Nie-Nie”. Jak powinienem używać zmiennych globalnych w moim systemie, czy powinienem ich całkowicie unikać?
Chciałbym skorzystać z cennych rad od was na ten temat, aby moje oprogramowanie układowe było bardziej kompaktowe.
static
pliku @endolith to nie to samo, co „globalny”, patrz moja odpowiedź poniżej.Odpowiedzi:
Z powodzeniem możesz używać zmiennych globalnych, o ile pamiętasz wytyczne @ Phila. Oto kilka dobrych sposobów na uniknięcie problemów bez zmniejszania kompilacji kodu.
Użyj lokalnych zmiennych statycznych dla trwałego stanu, do którego chcesz uzyskać dostęp tylko w obrębie jednej funkcji.
Użyj struct, aby utrzymać powiązane zmienne razem, aby było wyraźniej, gdzie powinny być używane, a gdzie nie.
Użyj globalnych zmiennych statycznych, aby zmienne były widoczne tylko w bieżącym pliku C. Zapobiega to przypadkowemu dostępowi do kodu w innych plikach z powodu konfliktów nazw.
Na koniec, jeśli modyfikujesz zmienną globalną w ramach procedury przerwania i czytasz ją w innym miejscu:
volatile
.LUB
źródło
volatile
zmiennych jest umożliwienie działania kodu w jednym kontekście wykonania, aby kod w innym kontekście wykonania mógł wiedzieć, że coś się wydarzyło. W systemie 8-bitowym bufor, który ma pomieścić potęgę dwóch bajtów nie większą niż 128, może być zarządzany jednym lotnym bajtem wskazującym całkowitą liczbę bajtów włożoną do bufora (mod 256) i inny oznacza liczbę wyciągniętych bajtów w ciągu całego życia, pod warunkiem, że tylko jeden kontekst wykonania umieszcza dane w buforze, a tylko jeden z nich.Powody, dla których nie chcesz używać zmiennych globalnych w systemie 8-bitowym są takie same, jak nie chcesz ich używać w żadnym innym systemie: utrudniają one rozumowanie na temat zachowania programu.
Tylko źli programiści rozłączają się na zasadach takich jak „nie używaj zmiennych globalnych”. Dobrzy programiści rozumieją powód reguł, a następnie traktują je bardziej jak wytyczne.
Czy twój program jest łatwy do zrozumienia? Czy jego zachowanie jest przewidywalne? Czy łatwo jest modyfikować jego części bez zepsucia innych części? Jeśli odpowiedź na każde z tych pytań brzmi „ tak” , to jesteś na dobrej drodze do dobrego programu.
źródło
Nie powinieneś całkowicie unikać używania zmiennych globalnych (w skrócie „globals”). Ale powinieneś ich używać rozsądnie. Praktyczne problemy z nadmiernym użyciem globali:
Dobrą praktyką jest dodawanie przedrostka
g_
do nazwy zmiennych globalnych. Na przykładg_iFlags
. Kiedy zobaczysz zmienną z prefiksem w kodzie, natychmiast rozpoznasz, że jest to zmienna globalna.źródło
static
flaga stałaby się widoczna dlamain()
? Czy sugerujesz, że ta sama funkcja, która ma tę funkcję,static
może przywrócić jąmain()
później?Zaletą globalnych struktur danych w pracy osadzonej jest to, że są one statyczne. Jeśli każda potrzebna zmienna ma charakter globalny, nigdy nie zabraknie ci pamięci po wprowadzeniu funkcji i zwolnieniu miejsca na stosie. Ale w takim razie po co funkcje? Dlaczego nie jedna duża funkcja, która obsługuje całą logikę i procesy - jak program BASIC bez GOSUB-a. Jeśli posuniesz ten pomysł wystarczająco daleko, będziesz miał typowy program języka asemblera z lat siedemdziesiątych. Wydajne i niemożliwe do utrzymania i rozwiązywania problemów.
Używaj więc globalnie rozsądnie, takich jak zmienne stanu (na przykład, jeśli każda funkcja musi wiedzieć, czy system jest w stanie interpretacji lub uruchomienia) i inne struktury danych, które muszą być widoczne przez wiele funkcji i jak mówi @PhilFrost, zachowanie twoje funkcje są przewidywalne? Czy istnieje możliwość wypełnienia stosu ciągiem wejściowym, który nigdy się nie kończy? Są to kwestie dotyczące projektowania algorytmów.
Zauważ, że statyczny ma inne znaczenie wewnątrz i na zewnątrz funkcji. /programming/5868947/difference-between-static-variable-inside-and-outside-of-a-function
/programming/5033627/static-variable-inside-of-a-function-in-c
źródło
Zmienne globalne powinny być używane tylko dla prawdziwie globalnego stanu. Użycie zmiennej globalnej do przedstawienia czegoś w rodzaju np. Szerokości geograficznej północnej granicy mapy będzie działać tylko wtedy, gdy będzie tylko jedna „północna granica mapy”. Jeśli w przyszłości kod będzie musiał działać z wieloma mapami, które mają różne granice północy, kod, który używa zmiennej globalnej dla granicy północnej, prawdopodobnie będzie musiał zostać przerobiony.
W typowych aplikacjach komputerowych często nie ma szczególnego powodu, aby zakładać, że nigdy nie będzie więcej niż jednego z nich. Jednak w systemach wbudowanych takie założenia są często znacznie bardziej uzasadnione. Chociaż możliwe jest, że typowy program komputerowy może zostać wezwany do obsługi wielu jednoczesnych użytkowników, interfejs użytkownika typowego systemu osadzonego zostanie zaprojektowany do działania przez jednego użytkownika wchodzącego w interakcję z jego przyciskami i wyświetlaczem. Jako taki będzie miał w dowolnym momencie pojedynczy stan interfejsu użytkownika. Zaprojektowanie systemu w taki sposób, aby wielu użytkowników mogło wchodzić w interakcje z wieloma klawiaturami i wyświetlaczami, wymagałoby znacznie większej złożoności i jego wdrożenie zajęłoby znacznie więcej czasu niż zaprojektowanie go dla jednego użytkownika. Jeśli system nigdy nie jest wzywany do obsługi wielu użytkowników, wszelkie dodatkowe wysiłki włożone w ułatwienie takiego użytkowania zostaną zmarnowane. O ile nie jest prawdopodobne, że wymagana będzie obsługa wielu użytkowników, rozsądniej byłoby zaryzykować konieczność odrzucenia kodu używanego dla interfejsu jednego użytkownika w przypadku, gdy wymagana jest obsługa wielu użytkowników, niż poświęcenie dodatkowego czasu na dodawanie wielu wsparcie użytkownika, które prawdopodobnie nigdy nie będzie potrzebne.
Powiązanym czynnikiem w przypadku systemów osadzonych jest to, że w wielu przypadkach (szczególnie z udziałem interfejsów użytkownika) jedynym praktycznym sposobem obsługi więcej niż jednego z nich byłoby użycie wielu wątków. W przypadku braku innej potrzeby wielowątkowości, prawdopodobnie lepiej jest zastosować prostą konstrukcję jednowątkową niż zwiększyć złożoność systemu dzięki wielowątkowości, która prawdopodobnie nigdy nie będzie naprawdę konieczna. Jeśli dodanie więcej niż jednego z elementów wymagałoby i tak ogromnego przeprojektowania systemu, nie będzie miało znaczenia, czy wymaga to również przerobienia użycia niektórych zmiennych globalnych.
źródło
Wiele osób ma wątpliwości co do tego tematu. Definicja zmiennej globalnej to:
To nie to samo, co zmienne zakresu pliku , które są deklarowane przez słowo kluczowe
static
. To nie są zmienne globalne, to lokalne zmienne prywatne.Czy powinieneś używać zmiennych globalnych? Jest kilka przypadków, w których jest w porządku:
W każdym innym przypadku nie wolno nigdy używać zmiennych globalnych. Nigdy nie ma ku temu powodu. Zamiast tego użyj zmiennych zakresu pliku , co jest całkowicie w porządku.
Powinieneś dążyć do napisania niezależnych, autonomicznych modułów kodu zaprojektowanych do wykonania określonego zadania. Wewnątrz tych modułów wewnętrzne zmienne zakresu plików powinny znajdować się jako prywatne elementy danych. Ta metoda projektowania znana jest jako orientacja obiektowa i powszechnie uznawana za dobrą konstrukcję.
źródło
.data
segmentem.