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

 
 
> 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

Сообщений в этой теме
- Laksus   WinAVR, _delay_ms(), строки и оптимизация.   Nov 5 2010, 19:17
- - artymen   Функции из util/delay.h имеют одну пакость, из док...   Nov 5 2010, 19:46
|- - Laksus   Цитата(artymen @ Nov 5 2010, 22:46) ... п...   Nov 5 2010, 22:52
|- - ASZ   Может, это снобизм, но принципиально не использую ...   Nov 5 2010, 23:09
- - Genadi Zawidowski   У функции _delay_ms() есть ограничение на максимал...   Nov 5 2010, 19:48
- - artymen   Посмотрите, укладывается ли полученный бинарник во...   Nov 6 2010, 05:12
|- - Сергей Борщ   Цитата(artymen @ Nov 6 2010, 08:12) GCC (...   Nov 6 2010, 06:44
|- - MrYuran   Цитата(Сергей Борщ @ Nov 6 2010, 09:44) К...   Nov 6 2010, 07:37
- - artymen   ЦитатаФигня полная. Прекрасно следит. А если у вас...   Nov 6 2010, 10:32
- - alexeyv   Маленькое замечание по поводу кода: КодUDR= Addre...   Nov 8 2010, 05:07
- - Сергей Борщ   Цитата(artymen @ Nov 6 2010, 12:32) Возмо...   Nov 8 2010, 09:08
|- - Laksus   Цитата(Сергей Борщ @ Nov 8 2010, 12:08) ....   Nov 8 2010, 22:16
||- - Qwertty   Цитата(Laksus @ Nov 9 2010, 02:16) Просто...   Nov 8 2010, 23:06
||- - Сергей Борщ   Цитата(Laksus @ Nov 9 2010, 00:16) ___ vo...   Nov 10 2010, 08:33
||- - Laksus   Цитата(Сергей Борщ @ Nov 10 2010, 11:33) ...   Nov 10 2010, 11:15
||- - Сергей Борщ   Цитата(Laksus @ Nov 10 2010, 13:15) но в ...   Nov 10 2010, 11:55
|- - alexeyv   Цитата(Сергей Борщ @ Nov 8 2010, 14:08) О...   Nov 9 2010, 04:23
- - Marian   При уровне оптимизации -Os, компилятор выкидывает ...   Nov 8 2010, 14:56


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

 


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


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