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

 
 
> Как вразумить avr-gcc ?, Компилятор заоптимизировал volatile переменную
impatt
сообщение Oct 23 2006, 08:55
Сообщение #1


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

Группа: Validating
Сообщений: 169
Регистрация: 10-11-04
Из: Челябинск
Пользователь №: 1 088



Пробую avr-gcc-3.3.1 и avr-gcc-4.1.1.
C-шный текст прост:
в цикле проверяется значение переменной и если оно, скажем, не ноль, то цикл продолжает крутиться. Если бы переменная не была изменяемая извне (прерыванием), то тогда бы такой код совершенно надёжно был бы вечно зацикленным. Однако прерывание меняет переменную. Но компилятор почему-то даже объявленную переменную как volatile, засасывает в регистры и потом, в цикле, проверяет содержимое регистров, куда ты была засосана. А прерывание, как все нормальные функции, берёт переменную в ОЗУ по её адресу, меняет, и кладёт назад. таким образом, цикл не почувстует изменение переменной, что не есть гут.
Если я ставлю отпимизацию -O0, то всё ОК, ошибки нет. Если -O2, -Os, то всё, неправильно - заоптимизируется до регистров. Оставлять оптимизацию -O0 - не кошерно, не годится.
Что сделать, чтобы компилятор перестал игнорировать спецификатор(модификатор) volatile ?

Спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
aesok
сообщение Oct 23 2006, 09:07
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



GCC не игнорирует volatile!!! Ошибка в чем то другом. Показывайте код.

Анатолий.
Go to the top of the page
 
+Quote Post
impatt
сообщение Oct 23 2006, 09:19
Сообщение #3


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

Группа: Validating
Сообщений: 169
Регистрация: 10-11-04
Из: Челябинск
Пользователь №: 1 088



Цитата(aesok @ Oct 23 2006, 12:07) *
GCC не игнорирует volatile!!! Ошибка в чем то другом. Показывайте код.

Анатолий.


Показываю (прошу прощения за кривое форматирование: не могу своим умом постигнуть, как в этом форуме делать вёрстку, может, оттого, что не знаю html ?) :

Фрагмент файл uart.c:
******
Код
#include "interface/uart.h"
uint8_t pushToDebugBuffer(uint8_t symbol){
DEBUG_TX_INT_LOCK();
while(debugPushCursor == debugPopCursor){
  DEBUG_TX_INT_UNLOCK();
  SLEEP();
  DEBUG_TX_INT_LOCK();
}
*debugPushCursor = symbol;
debugPushCursor = nextAddress(debugPushCursor);
DEBUG_TX_INT_UNLOCK();
if(!globIntFlags.isDebugPortBusy) popFromDebugBuffer(); //если передача когда-то закончилась, то возобновляем её
return symbol;
}

******

Фрагмент файла uart.h (макрос CLARBIT, SETBIT просто логическая операция над портом, определно где-то, ) :
*******
Код
//SPECPREFIX пустой, если заголовок подключается из uart.c, и равен extern, если другими
SPECPREFIX uint8_t debugBuffer[32];
SPECPREFIX volatile uint8_t *debugPushCursor;
SPECPREFIX volatile uint8_t *debugPopCursor;

#define DEBUG_TX_INT_LOCK(s)  CLEARBIT(UCSR1B, TXCIE1)
#define DEBUG_TX_INT_UNLOCK(s)  SETBIT(UCSR1B, TXCIE1)
*******

Фрагмент кода прерывания:

******
#include "interface/uart.h"
INTERRUPT(/*SIG_UART0_TRANS*/SIG_USART1_TRANS){
// например,  
debugPopCursor++;
}
******
Go to the top of the page
 
+Quote Post
aesok
сообщение Oct 23 2006, 09:32
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



SPECPREFIX volatile uint8_t *debugPushCursor;

Если не ошибаюсь:
в этом коде volatile помечен не указатель а то на что этот указатель указывает, попробуйте так:

SPECPREFIX uint8_t volatile *debugPushCursor;


Если есть книга по С/C++ под рукой попробуйте найти про модификатор const и указатили.

Анатолий.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- impatt   Как вразумить avr-gcc ?   Oct 23 2006, 08:55
- - prottoss   Цитата(impatt @ Oct 23 2006, 16:55) Пробу...   Oct 23 2006, 09:02
|- - impatt   Цитата(prottoss @ Oct 23 2006, 12:02) Цит...   Oct 23 2006, 09:10
|- - zltigo   Цитата(prottoss @ Oct 23 2006, 12:02) дан...   Oct 23 2006, 09:18
||- - impatt   Цитата(aesok @ Oct 23 2006, 12:32) SPECPR...   Oct 23 2006, 09:48
|- - zltigo   Цитата(impatt @ Oct 23 2006, 12:19) Показ...   Oct 23 2006, 09:35
|- - klen   Вот результат компиляции по мотивам приведеннго вы...   Oct 23 2006, 09:51
|- - impatt   Цитата(klen @ Oct 23 2006, 12:51) Вот рез...   Oct 23 2006, 10:07
|- - impatt   Цитата(klen @ Oct 23 2006, 12:51) Вот рез...   Oct 23 2006, 10:47
|- - aesok   Что генерирует GCC смогу посмотреть вечером. (точ...   Oct 23 2006, 11:45
|- - Сергей Борщ   Цитата(impatt @ Oct 23 2006, 13:47) Польз...   Oct 23 2006, 11:56
|- - impatt   Цитата(Сергей Борщ @ Oct 23 2006, 14:56) ...   Oct 24 2006, 02:06
|- - zltigo   Цитата(impatt @ Oct 24 2006, 05:06) Тепер...   Oct 24 2006, 07:11
|- - impatt   Цитата(zltigo @ Oct 24 2006, 10:11) Вещь ...   Oct 24 2006, 07:54
- - Andy Great   ЦитатаТеперь вопрос-завершение: откуда узнаются та...   Oct 24 2006, 08:06


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

 


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


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