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

 
 
> Немного стандарта написания программ на С, применительно к контроллерам
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
Ответов
xemul
сообщение Oct 26 2009, 11:05
Сообщение #2



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Переменная, используемая в прерывании, должна быть объявлена как volatile, что приведёт к её размещению в статической банке - здесь ничего не съэкономить.
Ну и компилятор может не переварить volatile у локальной переменной.
Касательно переноса кода - код, завязанный на прерывания, переносится ручками и глазкамиsmile.gif.
Go to the top of the page
 
+Quote Post
Dima_G
сообщение Oct 26 2009, 11:37
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699



Цитата(xemul @ Oct 26 2009, 15:05) *
Ну и компилятор может не переварить volatile у локальной переменной.

В первый раз слышу..
На каком компиляторе у Вас вылезла такая проблема?
Часто использовал локальные volatile переменные на многих платформах - gcc powerpc, gcc arm, gcc blackfin, VisualDSP, CodeComposer - никогда не имел с этим проблеммы smile.gif


Цитата(MrYuran @ Oct 26 2009, 15:22) *
biggrin.gif
Ну хотя бы в том, что иногда приходится считать (кило)байты и микросекунды. В особо запущенных случаях счёт идёт на такты...


Ну я понимаю smile.gif
Более того, иногда и для PC (кстати, а что в вашем понимании PC? Blackfin с uClinux в него входит? А PowerPC c Linux? rolleyes.gif ) приходится сильно оптимизировать код.

Хороший программист должен писать эффективный код, хоть на дохленьком PIC, хоть на 6 ядерном TMS64+
Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 26 2009, 11:48
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 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 - никогда не имел с этим проблеммы smile.gif

Часто? Часто это скорее всего плохо, ибо мне известен только один случай, когда volatile применительно к локальной переменной имеет смысл, да и тот по сути есть вредительство. Не поделитесь примерами использования? Банальное любопытство мучает.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Dima_G
сообщение Oct 26 2009, 11:55
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 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_ = ...
  }

};
Go to the top of the page
 
+Quote Post
ReAl
сообщение Oct 26 2009, 12:57
Сообщение #6


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(Dima_G @ Oct 26 2009, 13:55) *
Инициализация периферии. Если этот регистр более нигде не нужен, использую его только локальной переменной
Да ну...
Тут у Вас локальной переменной есть pdwInitReg_, но она ни на грамм не volatile. Указывает на volatile, но на НЕ локальную.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
Dima_G
сообщение Oct 26 2009, 13:03
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699



Цитата(ReAl @ Oct 26 2009, 15:57) *
Да ну...
Тут у Вас локальной переменной есть pdwInitReg_, но она ни на грамм не volatile. Указывает на volatile, но на НЕ локальную.


smile.gif Ну да
Перепутал маленько
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   Цитата(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


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

 


RSS Текстовая версия Сейчас: 29th July 2025 - 16:51
Рейтинг@Mail.ru


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