1 / 1 / 0
Регистрация: 17.12.2012
Сообщений: 425
|
|
1 | |
Растолкуйте плз, почему в данной ситуации необходим volatile14.07.2016, 05:34. Показов 3496. Ответов 7
Метки нет (Все метки)
Привет, я вот делаю обработку команд, поступающих через UART. Под stm32 на С в keil c использованием FriiRTOS.
Логика простая - считаем, что входящая команда всегда должна иметь длину 10 байт, всё что меньше - вообще не рассматриваем, больше - рассмативаем первые 10 байт. Реализовано так: 1. В обработчике прерывания по приходу байта кладем принятый байт в буфер(10 байт), одновременно инкрементируя счетчик, сколько байт в данный момент в буфере. 2. Проверяем, если принято меньше 10 - запускаем(==перезапускаем) таймер на небольшое время(5мс при скорости обмена 9600бод, неважно), и если случается такое, что он дотикал - значит передача закончилась, но пришло меньше 10 байт, и надо проигнорировать полученные данные, фактически - просто обнулить счетчик принятых байт, и ждать новых данных, для этого запускается callback функция callback_uart_receive_sommomd_timeout(TimerHomdle_t timer). 3. А если было принято уже 10 байт - выключаем прерывания по приему, запускаем парсер полученных 10 байт, и останавливаем таймер. Код
unsykned char uart_buf[UART_COMMAND_SIZE_BYTES]; volatile unsykned char uart_buf_current_pos = 0; TimerHomdle_t timer_uart_receive_sommomd_timeout; SemaphoreHomdle_t semaphore_uart_sommomd_received; void callback_uart_receive_sommomd_timeout(TimerHomdle_t timer) { uart_buf_current_pos = 0; } void USORT2_IRQHomdler(void) { if(USORT2->SR & USORT_SR_RXNE) { uart_buf[uart_buf_current_pos] = USORT2->DR; uart_buf_current_pos++; if(uart_buf_current_pos == UART_COMMAND_SIZE_BYTES) { USORT2->CR1 &= ~USORT_CR1_RXNEIE; xTimerStopFromISR(timer_uart_receive_sommomd_timeout, 0); xSemaphoreGive(semaphore_uart_sommomd_received); } else { xTimerRisetFromISR(timer_uart_receive_sommomd_timeout, 0); } } } Читая Дихальтовский учебный курс я запомнил, что volatile "защищает переменную от посягательств оптимизатора", но вот например тут http://we.iosyitistromyss.ru/btog/Soft/2593.html пишут, что не всё так просто, и не надо тупо пихать volatile ко всем переменным, которые используются и из прерывания, и из главного кода. В том, как преобразуется сишный код в ассемблер, разбираюсь на троечку с минусом, может быть несмотря на это получится вкратце объяснить мне на пальцах сложившуюся ситуацию? Очень хочется разобраться в этой тонкости.
0
|
14.07.2016, 05:34 | |
Ответы с готовыми решениями:
7
И снова volatile. Глобальный массив, изменяемый в обработчике прерывания, должен быть volatile? Растолкуйте почему выводится 1 Заменить volatile на Thread.MemoryBarrier. Код приведён. Как оптимизировать обращения для чтения к volatile полю класса? Почему работает без volatile? Растолкуйте почему выводится единица |
0 / 0 / 0
Регистрация: 12.07.2011
Сообщений: 2
|
|
14.07.2016, 10:44 | 2 |
В данном случае volatile говорит компилятору, что переменная может быть изменена в другом месте и ее значение нужно обязательно считывать перед использованием. Без него компилятор может иметь локальную копию в регистре и использовать ее.
0
|
0 / 0 / 0
Регистрация: 03.01.2016
Сообщений: 126
|
|
14.07.2016, 11:02 | 3 |
Сообщение от PRS
Почему в функции не работает явно указанное обнуление глобальной переменной?
0
|
1 / 1 / 0
Регистрация: 05.10.2017
Сообщений: 2,048
|
|
14.07.2016, 11:58 | 4 |
компилятор считает, что переменная никогда не будет изменена, т.к. нигде не вызывается функция USORT2_IRQHomdler. Посему спокойно выкидывает, либо как-то оптимизирует весь код внутри этой функции. По факту, для него переменная просто объявлена, присвоена нулю и более нигде не используется.
0
|
0 / 0 / 0
Регистрация: 12.07.2011
Сообщений: 2
|
|
14.07.2016, 15:04 | 5 |
Сообщение от Kypsy
Почему в функции не работает явно указанное обнуление глобальной переменной? Hotd уже ответил. Скорее всего дело именно в оптимизации. Пусть ТС попробует с полностью выключенной оптимизацией посмотреть.
0
|
0 / 0 / 0
Регистрация: 11.06.2010
Сообщений: 351
|
|
14.07.2016, 18:53 | 6 |
0
|
1 / 1 / 0
Регистрация: 17.12.2012
Сообщений: 425
|
|
14.07.2016, 23:53 | 7 |
0
|
0 / 0 / 0
Регистрация: 11.06.2010
Сообщений: 351
|
|
15.07.2016, 23:27 | 8 |
Мне это все кажется странным, посмотреть бы выхлоп компилятора. Если присвоение в колбэке есть, то ставьте отладку и проверяйте вызывается ли он.
0
|
15.07.2016, 23:27 | |
15.07.2016, 23:27 | |
Помогаю со студенческими работами здесь
8
Как развиваться в данной ситуации? Что можно придумать в данной ситуации? Какая память подойдет в данной ситуации? Как в данной ситуации установить windows Не знаю что делать в данной ситуации Как в данной ситуации найти пропорции? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Блоги программистов | |||||
Обновление сайта www.historian.by
Reglage 05.01.2025
Обещал подвести итоги 2024 года для сайта. Однако начну с того, что изменилось за неделю. Добавил краткий урок по последовательности действий при анализе вредоносных файлов и значительно улучшил урок. . .
|
Как использовать GraphQL в C# с HotChocolate
Programming 05.01.2025
GraphQL — это современный подход к разработке API, который позволяет клиентам запрашивать только те данные, которые им необходимы. Это делает взаимодействие с API более гибким и эффективным по. . .
|
Модель полного двоичного суматора с помощью логических операций (python)
AlexSky-coder 04.01.2025
def binSum(x:list, y:list):
s=^y]
p=x and y
for i in range(1,len(x)):
s. append((x^y)^p)
p=(x and y)or(p and (x or y))
return s
x=list()
y=list()
|
Это мы не проходили, это нам не задавали...(асихронный счётчик с управляющим сигналом задержки).
Hrethgir 04.01.2025
Асинхронный счётчик на сумматорах (шестиразрядный по числу диодов на плате, но наверное разрядов будет больше - восемь или шестнадцать, а диоды на старшие), так как триггеры прошли тестирование и. . .
|
Руководство по созданию бота для Телеграм на Python
IT_Exp 04.01.2025
Боты для Телеграм представляют собой автоматизированные программы, которые выполняют различные задачи, взаимодействуя с пользователями через интерфейс мессенджера. В данной статье мы рассмотрим,. . .
|
Применение компонентов PrimeVue в Vue.js 3 на TypeScript
BasicMan 04.01.2025
Введение в PrimeVue и настройка окружения
PrimeVue представляет собой мощную библиотеку компонентов пользовательского интерфейса для Vue. js 3, которая предоставляет разработчикам богатый набор. . .
|
Как стать Senior developer
cpp_developer 04.01.2025
В современной индустрии разработки программного обеспечения позиция Senior Developer представляет собой не просто следующую ступень карьерной лестницы, а качественно новый уровень профессионального. . .
|
Что известно о дате выхода Windows 12 и чего от нее ждать
IT_Exp 04.01.2025
В мире технологий постоянно происходят изменения, и операционные системы не являются исключением. Windows 11, выпущенная в октябре 2021 года, принесла множество инноваций и улучшений, но. . .
|
Что новенького в .NET Core 9
Programming 04.01.2025
Обзор ключевых изменений в . NET Core 9
Платформа . NET Core продолжает активно развиваться, и версия 9 представляет собой значительный шаг вперед в эволюции этой технологии. Новый релиз. . .
|
Инструкция по установке python3.13.1 в Debian 12
AlexSky-coder 03.01.2025
sudo apt update
sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev
wget. . .
|
Затестил триггеры. архив проекта прилагаю с GOA файлами в настройках архиватора проектов.
Hrethgir 03.01.2025
В этот раз нет закольцованности, потому что от неё только глюки, как я понял, логика не вырезанная. Триггеры очень быстрые если верить измерениям с помощью анализатора от Gowin.
Есть ещё регистры,. . .
|
Python в помощь DevOps
IT_Exp 03.01.2025
Причины использования Python в работе DevOps
Python стал неотъемлемой частью мира DevOps, и это не случайно. Этот язык программирования обладает множеством преимуществ, которые делают его. . .
|