Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
06.01.2017, 16:26
|
|
Прописка
Регистрация: 16.03.2007
Адрес: Невинномысск, STAVROPOL REGION (26)
Сообщений: 118
Сказал спасибо: 583
Сказали Спасибо 28 раз(а) в 15 сообщении(ях)
|
Keil C51 и volatile. Массив, изменяемый в обработчике прерывания - volatile?
Всем привет.
Имеется официальный код примера на чип-трансивер nrf24LE1 от Nordic.
Keil C51
Код:
|
// Global variables
uint8_t payload[3];
// Radio interrupt
NRF_ISR() //Обработчик прерывания, макросс #define NRF_ISR() void nrf_isr(void) interrupt 8 // RF interrupt (0x4b)
{
...
// Read payload
...
hal_nrf_read_rx_payload(payload);
...
} |
Функция hal_nrf_read_rx_payload(payload) принимает аргумент-указатель и читает данные из буфера обмена чипа в этот массив.
Кто-нибудь, пожалуйста, объясните, почему в этом коде программисты глобальный массив uint8_t payload[3] не объявили как volatile ???
Уже 4 часа не могу вкурить.
На форуме Keil пишут, что надо.
http://www.keil.com/forum/3380/
Спасибо!
Последний раз редактировалось ArtemKolesnikov; 06.01.2017 в 16:31.
Причина: ссылка на форум keil
|
|
|
|
06.01.2017, 17:12
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,220 раз(а) в 1,319 сообщении(ях)
|
Re: Keil C51 и volatile. Массив, изменяемый в обработчике прерывания - volatile?
volatile - рекомендация компилятору не оптимизировать (не изменять по своему усмотрению) работу с этими переменными, когда включается оптимизация, и компилятор вдруг может обнаружить возможность оптимизации (сокращения, ускорения) операций. "Может", но не "обязан".
|
|
|
Сказали "Спасибо" NewWriter
|
|
|
07.01.2017, 23:03
|
|
Прописка
Регистрация: 16.03.2007
Адрес: Невинномысск, STAVROPOL REGION (26)
Сообщений: 118
Сказал спасибо: 583
Сказали Спасибо 28 раз(а) в 15 сообщении(ях)
|
Re: Keil C51 и volatile. Массив, изменяемый в обработчике прерывания - volatile?
Тут прочитал информацию, что оптимизация массива (не volatile) не будет производиться, если этот массив передается в функцию. Как раз мой случай. Прочитал в комментариях на хабрахабре. Эти слова имеют законное основание?
|
|
|
|
07.01.2017, 23:14
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,087
Сказал спасибо: 2,564
Сказали Спасибо 11,898 раз(а) в 5,971 сообщении(ях)
|
Re: Keil C51 и volatile. Массив, изменяемый в обработчике прерывания - volatile?
Сообщение от ArtemKolesnikov
|
почему в этом коде программисты глобальный массив uint8_t payload[3] не объявили как volatile ???
|
Вообще-то, если в тексте программы есть прямое явное обновление данных массива, то он не должен подвергаться оптимизации. Вот если заполнение идет через ПДП от периферии, то компилятор запросто может посчитать, что объявленный массив содержит нули и он просто не нужен.
Но это теоретически. Практически - я уже ходил по этим граблям: что и как расценит компилятор - и разработчик не всегда скажет. "Лучше перебздеть, чем недобдеть"(с) Кстати, то же относится к неявным преобразованиям типов.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 12:55.
|
|