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

 
 
> WinAVR, _delay_ms(), строки и оптимизация.
Laksus
сообщение Nov 5 2010, 19:17
Сообщение #1


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

Группа: Участник
Сообщений: 146
Регистрация: 16-05-05
Пользователь №: 5 069



Програмка для ATmega32, WinAVR-20100110.
Инициализируется USART для передачи.
После этого хочу отправить через USART несколько групп символов. С паузой между группами в несколько секунд.
Задержки решил сделать через _delay_ms(2000).

Оказалось, что если оптимизация "OPT = s", то правильно передается только последняя строка, а вместо остальных строк передается мусор. Насколько я понял указатель ставится на адрес ноль, а не на адрес строки.
Если отключить оптимизацию ("OPT = 0"), то все строки передаются правильно.

Если вместо _delay_ms() использую самодельную задержку delay_sec(uint8_t T){for..{for..{for..{for..{asm("nop")}}}}},
то все строки передаются нормально и при "OPT = s"

Большой проблемы нет, так как с самдельной задержкой вроде бы работает.
Но хотелось бы узнать причину, чтобы не получить проблем в дальнейшем.
_______
Как правильно использовать _delay_ms(), чтобы работало и при оптимизации?

Код
//код . . .

char *StringLCD;
char Hello_1[]= "11111111111111111111111111111111";
char Hello_2[]= "22222222222222222222222222222222";

//------------------------------------------------------
int main(void)
{
init();

UDR= Address_1;// пошлем адрес
StringLCD= Hello_1;
UCSRB|= (1<<UDRIE);//и отправим нужную строку
_delay_ms(2000);

UDR= Address_1;// пошлем адрес
StringLCD= Hello_2;
UCSRB|= (1<<UDRIE);//и отправим нужную строку
_delay_ms(2000);

for(;;);
return 0;
}
//------------------------------------------------------
ISR(USART_UDRE_vect)
{
    static uint8_t    j= 0;
    if(j< 32)
    {
        UDR= StringLCD[j++];
    }
    else
    {
        j=0;
        UCSRB&= ~(1<<UDRIE);
    }
}
Go to the top of the page
 
+Quote Post
2 страниц V  < 1 2  
Start new topic
Ответов (15 - 17)
Сергей Борщ
сообщение Nov 10 2010, 08:33
Сообщение #16


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Laksus @ Nov 9 2010, 00:16) *
___
volatile не помогает, ничего не меняется.
___
Покажите, как вы его применили. Сдается, что вы вместо volatile-указателя на char объявили указатель на volatile char. Потому и не помогло.
alexeyv - насчет безликого init() согласен. Но раз дальше идет разрешение прерывания UDRIE, то логично предположить что оно было запрещено до этого. Иначе бы мы просто постоянно крутились в его обработчике.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Laksus
сообщение Nov 10 2010, 11:15
Сообщение #17


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

Группа: Участник
Сообщений: 146
Регистрация: 16-05-05
Пользователь №: 5 069



Цитата(Сергей Борщ @ Nov 10 2010, 11:33) *
... Сдается, что вы вместо volatile-указателя на char объявили указатель на volatile char. Потому и не помогло. ...

Так точно! Я ж эту volatile пытался влепить в кучу мест (примерно как мартышка очки), и только после звездочки не догадался (она ж у меня вплотную к переменной пририсована, вот как-то в голову и не пришло, .что туды можно что-то добавить.)
Код
    char *volatile StringLCD;//  работает так как хотел


Большое спасибо за помощь.
Хоть в данном случае большой проблемы и не было, но в дальнейшем незнание разницы между volatile-указателем и укзателем на volatle еще не раз бы о себе напомнило. (Хотя я пока еще толком не понял этой разницы, но гугль говорит, что на эти грабли настапают многие. Есть много обсуждений этого вопроса, почитаю, надеюсь пойму.)

Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 10 2010, 11:55
Сообщение #18


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Laksus @ Nov 10 2010, 13:15) *
но в дальнейшем незнание разницы между volatile-указателем и укзателем на volatle еще не раз бы о себе напомнило. (Хотя я пока еще толком не понял этой разницы
volatile-указатель: "указатель в любой момент может измениться сам по себе и указать на какое-то другое место".
Указатель на volatile - "то, на что указывает указатель может измениться само по себе".
Принцип тот же, что и с const -указателем - "этот указатель всегда указывает на одно и то же место, ты не можешь присвоить ему другое значение и заставить указывать в другое место".
Указатель на const - "может указывать куда угодно, но то, на что он указывает менять нельзя".


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

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

 


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


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