реклама на сайте
подробности

 
 
> Немного стандарта написания программ на С, применительно к контроллерам
torik
сообщение Oct 26 2009, 08:20
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
alekseykoj
сообщение Dec 14 2009, 06:35
Сообщение #2


Участник
*

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



Можно пользоваться указателями
например вот так:
Код
typedef struct {
  alt_buttons* buttons;                                             //ссылка на массив кнопок
  unsigned char max_key_num;                                //число кнопок в клавиатуре
  .......
  unsigned char alpha;                                             //прозрачность клавиатуры
} alt_keyboard;


void* h_VarA;


void Proc1(void)
{
  h_VarA->alpha = 123;  
}


main()
{
  alt_keyboard keyboard;

  system_init (&keyboard);

  h_VarA = (void*)&keyboard;

  Proc1();
}

Но в этом случае надо следить за указателем. Чтоб к нему не было обращений, когда он еще не инициализирован или динамическая структура уже освобождена
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 14 2009, 07:40
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(alekseykoj @ Dec 14 2009, 08:35) *
Можно пользоваться указателями
Можно, но какой смысл? Заводим локальную переменную в main() и через указатель делаем ее как-бы глобальной. Какие преимущества это дает по сравнению с обычной глобальной переменной? Т.е. ради чего занимается лишняя память под указатель и ради чего мы вынуждаем процессор постоянно обращаться к структуре косвенно?
Цитата(alekseykoj @ Dec 14 2009, 08:35) *
например вот так:
Вот так делать не нужно ни в коем случае. Вместо того, чтобы завести указатель на нужный тип и позволить компилятору контролировать ваши описки, вы заводите указатель на void * и вынуждены при каждом обращении вручную, принудительно приводить его к нужному типу. Компилятор не имеет возможности проверить, совместим ли объект, на который указывает указатель и тот тип, к которому вы его приводите методом грубой силы.
Цитата(alekseykoj @ Dec 14 2009, 08:35) *
Код
void Proc1(void)
{
  h_VarA->alpha = 123;  
}
Не скомпилится. h_VarA - указатель на void
Цитата(alekseykoj @ Dec 14 2009, 08:35) *
Код
  h_VarA = (void*)&keyboard;
Явное приведение лишнее. Любой не-cv (const и/или volatile) указатель приводится к void * неявно.

P.S. используйте кнопку на форме ввода для оформления кода.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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   Переменная, используемая в прерывании, должна быть...   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, 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 7th September 2025 - 06:22
Рейтинг@Mail.ru


Страница сгенерированна за 0.01491 секунд с 7
ELECTRONIX ©2004-2016

IPS Driver Error

IPS Driver Error

There appears to be an error with the database.
You can try to refresh the page by clicking here