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

 
 
> AVR 5.11 Ошибка при двухбайтном сравнении!
NewMaestro
сообщение Feb 2 2009, 22:54
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 76
Регистрация: 17-03-07
Из: Минск
Пользователь №: 26 243



Такой код:

volatile unsigned int msCounter = 0;

...

if (msCounter >= 1000) {

msCounter = 0;

//...

}

Иногда сравнение выполняется неправильно и входит в блок при значении msCounter = 768.
Установлено, что при двухбайтном сравнении происходит прерывание, в котором инкрементируется msCounter, что и приводит в последствии к ошибке.

if (msCounter >= 1000) {
00014A E9EB LDI R30,0x9B
00014C E0F1 LDI R31,0x01
00014E 8100 LD R16,Z
...тут прерывание и инкрементирование сравниваемой величины...
000150 8111 LDD R17,Z+1
000152 3E08 CPI R16,0xE8
000154 4013 SBCI R17,0x03
000156 F390 BRCS 0x13C
...


Вопрос: Можно ли заставить компилятор автоматически разруливать такие вещи?? Или это нужно постоянно держать в голове и делать вот так:

__disable_interrupt();

if (msCounter >= 1000) {

msCounter = 0;

//...

}

__enable_interrupt();

Заранее благодарен!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
xemul
сообщение Feb 3 2009, 13:46
Сообщение #2



*****

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



Цитата(NewMaestro @ Feb 3 2009, 01:54) *
Такой код:
Код
volatile unsigned int msCounter = 0;
...
if (msCounter >= 1000) {
      msCounter = 0;
      //...
}

Такой код предполагает, что прерывания таймера происходят с частотой 1 МГц. Оно реально нужно? Есть ли хоть одна задача, требующая такого дискрета по времени? 4 мкс не спасут? Тогда все укладывается в 1-байтовый счетчик.
Ладно, будем считать, что нужно время с разрешением в 1мкс. Что мешает выполнять все модификации счетчика в прерывании? Или наоборот, в прерывании только взводить флажок, а обрабатывать его, инкрементируя или обнуляя не-volatile счетчик, вне прерывания?

Цитата
Вопрос: Можно ли заставить компилятор автоматически разруливать такие вещи?

Можно выбирать контроллер под задачу.
Можно, придумывая структуру программы, учитывать возможности выбранного контроллера.
Можно ...
Нельзя думать, что компилятор будет читать Ваши мысли.

ЗЫЖ имхо, большинство бед человечества от уверенных в себе людей. Я предпочитаю сомневаться в своей уверенности.
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Feb 3 2009, 14:12
Сообщение #3


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



Цитата(xemul @ Feb 3 2009, 21:46) *
Такой код предполагает, что прерывания таймера происходят с частотой 1 МГц.

Почему же? Автор пишет, что иногда происходит сбой программы. Скорее всего иногда в момент сравнения происходит прерывание, которое модифицирует переменную и нарушает процесс сравнения.


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
xemul
сообщение Feb 3 2009, 14:22
Сообщение #4



*****

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



Цитата(haker_fox @ Feb 3 2009, 17:12) *
Почему же? Автор пишет, что иногда происходит сбой программы. Скорее всего иногда в момент сравнения происходит прерывание, которое модифицирует переменную и нарушает процесс сравнения.

Да, спасибо за пинок - глаз замылился, почему-то посчитал мс за мкс.
На остальном продолжаю настаивать smile.gif.
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 31st July 2025 - 02:30
Рейтинг@Mail.ru


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