|
Немного стандарта написания программ на С, применительно к контроллерам |
|
|
|
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, 11:37
|
Местный
  
Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699

|
Цитата(xemul @ Oct 26 2009, 15:05)  Ну и компилятор может не переварить volatile у локальной переменной. В первый раз слышу.. На каком компиляторе у Вас вылезла такая проблема? Часто использовал локальные volatile переменные на многих платформах - gcc powerpc, gcc arm, gcc blackfin, VisualDSP, CodeComposer - никогда не имел с этим проблеммы  Цитата(MrYuran @ Oct 26 2009, 15:22)   Ну хотя бы в том, что иногда приходится считать (кило)байты и микросекунды. В особо запущенных случаях счёт идёт на такты... Ну я понимаю  Более того, иногда и для PC (кстати, а что в вашем понимании PC? Blackfin с uClinux в него входит? А PowerPC c Linux?  ) приходится сильно оптимизировать код. Хороший программист должен писать эффективный код, хоть на дохленьком PIC, хоть на 6 ядерном TMS64+
|
|
|
|
|
Oct 26 2009, 11:48
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Dima_G @ Oct 26 2009, 14:37)  Часто использовал локальные volatile переменные на многих платформах - gcc powerpc, gcc arm, gcc blackfin, VisualDSP, CodeComposer - никогда не имел с этим проблеммы  Часто? Часто это скорее всего плохо, ибо мне известен только один случай, когда volatile применительно к локальной переменной имеет смысл, да и тот по сути есть вредительство. Не поделитесь примерами использования? Банальное любопытство мучает.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Oct 26 2009, 11:55
|
Местный
  
Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699

|
Цитата(zltigo @ Oct 26 2009, 15:48)  Часто? Часто это скорее всего плохо, ибо мне известен только один случай, когда volatile применительно к локальной переменной имеет смысл, да и тот по сути есть вредительство. Не поделитесь примерами использования? Банальное любопытство мучает. Инициализация периферии. Если этот регистр более нигде не нужен, использую его только локальной переменной Код class ClHardwareManager { static const DWORD INIT_REG_ADDR = 0x...; INT8 Init() { volatile DWORD* pdwInitReg_ = reinterpret_cast<volatile DWORD*>(INIT_REG_ADDR); *pdwInitReg_ = ... }
};
|
|
|
|
|
Oct 26 2009, 13:03
|
Местный
  
Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699

|
Цитата(ReAl @ Oct 26 2009, 15:57)  Да ну... Тут у Вас локальной переменной есть pdwInitReg_, но она ни на грамм не volatile. Указывает на volatile, но на НЕ локальную.  Ну да Перепутал маленько
|
|
|
|
Сообщений в этой теме
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 Dima_G Цитата(torik @ Oct 26 2009, 11:20)
Я сл... Oct 26 2009, 10:22 MrYuran Цитата(Dima_G @ Oct 26 2009, 14:22) 1. Ра... Oct 26 2009, 10:59  Dima_G Цитата(MrYuran @ Oct 26 2009, 14:59) Не з... Oct 26 2009, 11:20   MrYuran Цитата(Dima_G @ Oct 26 2009, 15:20) А в ч... Oct 26 2009, 11:22 ar__systems Цитата(Dima_G @ Oct 26 2009, 05:22) 1. им... Dec 4 2009, 02:35 torik Цитата1. именно этим и плохо. Разово нужная переме... Oct 26 2009, 10:38  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
|
|
|