|
Немного стандарта написания программ на С, применительно к контроллерам |
|
|
|
Oct 26 2009, 08:20
|

Гуру
     
Группа: Свой
Сообщений: 2 113
Регистрация: 1-11-05
Пользователь №: 10 359

|
Всем привет. Разрабатываю программу для PIC24F. Необходимо более-менее придерживаться стандарта. У меня вопрос следующий... Обычно все переменные я объединяю в структуры, группирую по назначению Код typedef struct { alt_buttons* buttons; //ссылка на массив кнопок unsigned char max_key_num; //число кнопок в клавиатуре ....... unsigned char alpha; //прозрачность клавиатуры } alt_keyboard; Это удобно, т.к. список аргументов функций будет представлять собой не кучу всяких переменных, а лишь одну структуру (или несколько). Правильно, вроде как, считается создавать локальные переменные и передавать их затем в качестве аргумента. Например, в main: Цитата void main (void) { alt_keyboard keyboard;
system_init (&keyboard); Но вот необходимо обрабатывать прерывания. Как же быть там? Получается, нужно работать с глобальными переменными. Это плохо? Кто как поступает? Можно основные переменные (например, клавиатура, дисплей и т.п.) сделать глобальными и работать с ними из любой функции. Не?
--------------------
Быть. torizin-liteha@yandex.ru
|
|
|
|
|
 |
Ответов
|
Oct 26 2009, 10:22
|
Местный
  
Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699

|
Цитата(torik @ Oct 26 2009, 11:20)  Я следую такому правилу - делать переменную глобальную только в том случае, когда без этого - никак (например, по другому никак не передать данные в/из обработчик прерываний и тд). Где-то вычитал правило и согласен с ним. Звучит как-то так: "Предпочитайте локальные переменные - глобальным, глобальные статические - просто глобальным" Цитата(MrYuran @ Oct 26 2009, 12:47)  А чем плохо? Переменная висит статически, в заранее известном адресе, существует всё время работы. 1. именно этим и плохо. Разово нужная переменная постоянно занимает память. 2. программы с глобальными переменными очень плохо читаются (ну это мое субъективное мнение) 3. глобальная - доступна всем желающим (во всей программе, либо в единице трансляции, если это - статик). Можно посадить трудноуловимые баги  . 4, Трудность переноса кода - если функция использует только локальные переменные, ее в общем случае можно просто "взять и выдернуть". Использующая глобальные переменные функция, потянет за собой хвост этих переменных...
|
|
|
|
|
Oct 26 2009, 10:59
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(Dima_G @ Oct 26 2009, 14:22)  1. Разово нужная переменная постоянно занимает память. Если разово, то согласен - локальные. Но бывают флаги/состояния, которые нужно хранить от вызова к вызову. Не забываем также, что речь идёт о программировании контроллеров, а не ПиСи Цитата 2. программы с глобальными переменными очень плохо читаются (ну это мое субъективное мнение) 3. глобальная - доступна всем желающим (во всей программе, либо в единице трансляции, если это - статик). Можно посадить трудноуловимые баги  . 4, Трудность переноса кода - если функция использует только локальные переменные, ее в общем случае можно просто "взять и выдернуть". Использующая глобальные переменные функция, потянет за собой хвост этих переменных... И что, предлагаете в мэйне организовать глобальную свалку переменных со всего проекта, а в каждую функцию передавать десяток параметров? Может, это и правильно с т.з. высоких материй (опять же применительно к PC), но в практической работе очень неудобно. Я в процессе эволюции пришёл к созданию максимально независимых модулей со своими глобальными и статическими переменными. Те переменные, которые надо видеть "снаружи" модуля, выношу extern-ом в h-файл модуля. А main в таком случае состоит из подключения соответствующих модулей через h-файлы, инициализации и быстрого суперцикла. "Взять и выдернуть" в таком случае можно не отдельную функцию, а модуль. Да и не надо его дёргать, просто подключить и использовать.
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Oct 26 2009, 11:20
|
Местный
  
Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699

|
Цитата(MrYuran @ Oct 26 2009, 14:59)  Не забываем также, что речь идёт о программировании контроллеров, а не ПиСи А в чем разница?  Цитата(MrYuran @ Oct 26 2009, 14:59)  И что, предлагаете в мэйне организовать глобальную свалку переменных со всего проекта, а в каждую функцию передавать десяток параметров? Может, это и правильно с т.з. высоких материй (опять же применительно к PC), но в практической работе очень неудобно. 1. Причем тут глобальная свалка? Не совсем пойму, что вы имеете в виду. Можете привести короткий пример? 2. Если в функцию передается больше 3х параметров (за редким исключением) - это повод задуматься о том, правильно ли разбили задачу на функции. Или возможно стоит объединить какие-то параметры в структуры. 3. Опять же - причем тут ПС? Или вы считаете, что хороший стиль на ПС и на МК отличается?
|
|
|
|
Сообщений в этой теме
torik Немного стандарта написания программ на С Oct 26 2009, 08:20 Alex B._ Цитата(torik @ Oct 26 2009, 12:20) Правил... Oct 26 2009, 08:35 MrYuran Цитата(Alex B._ @ Oct 26 2009, 12:35) в о... Oct 26 2009, 08:47 ar__systems Цитата(Dima_G @ Oct 26 2009, 05:22) 1. им... Dec 4 2009, 02:35 torik Цитата1. именно этим и плохо. Разово нужная переме... Oct 26 2009, 10:38 xemul Переменная, используемая в прерывании, должна быть... Oct 26 2009, 11:05 Dima_G Цитата(xemul @ Oct 26 2009, 15:05) Ну и к... Oct 26 2009, 11:37  zltigo Цитата(Dima_G @ Oct 26 2009, 14:37) Часто... Oct 26 2009, 11:48   Dima_G Цитата(zltigo @ Oct 26 2009, 15:48) Часто... Oct 26 2009, 11:55    ReAl Цитата(Dima_G @ Oct 26 2009, 13:55) Иници... Oct 26 2009, 12:57     Dima_G Цитата(ReAl @ Oct 26 2009, 15:57) Да ну..... Oct 26 2009, 13:03  xemul Цитата(Dima_G @ Oct 26 2009, 15:37) В пер... Oct 26 2009, 12:00 alekseykoj Можно пользоваться указателями
например вот так:
К... Dec 14 2009, 06:35 Сергей Борщ Цитата(alekseykoj @ Dec 14 2009, 08:35) М... Dec 14 2009, 07:40 alekseykoj ЦитатаМожно, но какой смысл? Заводим локальную пер... Dec 14 2009, 09:56 OLEG_BOS Цитата(alekseykoj @ Dec 14 2009, 11:56) В... Dec 14 2009, 10:44 alekseykoj Извиняюсь А так?
Кодtypedef struct {
alt_buttons... Dec 14 2009, 11:58 ar__systems Цитата(alekseykoj @ Dec 14 2009, 06:58) И... Dec 15 2009, 14:49 torik Стрелять-колотить. Хоть динамическая хоть статичес... Dec 14 2009, 13:49 OLEG_BOS Цитата(torik @ Dec 14 2009, 15:49) Она мо... Dec 14 2009, 14:24 alekseykoj Ну и делай ее глобальной. Ни каких "противопо... Dec 14 2009, 14:08 torik ЦитатаЕдинственное "противопоказание" сл... Dec 14 2009, 14:37
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|