|
|
  |
Подскажите где в WinAVR задаётся размер стека ?, Перевожу программу с WinAVR на IAR AVR |
|
|
|
Dec 19 2008, 09:55
|

Местный
  
Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423

|
Подскажите как правильно уйти от типа "prog_char" онже "PROGMEM" онже "prog_void" обявленного в WinAVR ? Аналогично PSTR() ? Имеются такие процедуры Код . #include <avr/pgmspace.h> . . . extern uint16_t fill_tcp_data_p(uint8_t *buf,uint16_t pos, const prog_char *progmem_s); extern uint16_t fill_tcp_data(uint8_t *buf,uint16_t pos, const char *s); . .
. plen=fill_tcp_data(buf,plen,password); plen=fill_tcp_data_p(buf,plen,PSTR("/\r\nContent-Type: text/html\r\nPragma: no-cache\r\n\r\n"));
Сообщение отредактировал west329_ - Dec 19 2008, 10:21
|
|
|
|
|
Dec 19 2008, 09:59
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(Сергей Борщ @ Dec 19 2008, 12:51)  Указатель стека ставится на конец набортного ОЗУ. Под стек отводится вся оставшаяся свободной набортная память. Есть еще момент, хорошо подаваемый AVRStudio gcc plugin. Кусок makefile. Опция линкера -minit-stack для задания начального адреса стека. Код ## Linker flags LDFLAGS = $(COMMON) LDFLAGS += -minit-stack=0x100
|
|
|
|
|
Dec 19 2008, 10:54
|

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

|
Цитата(_Pasha @ Dec 19 2008, 11:59)  Опция линкера -minit-stack для задания начального адреса стека. Не знал. Надо будет посмотреть, как она реализована. Если также, как в mspgcc - в прологе main() прописывает указатель - то это не лучшее решение. Лишний расход кода - указатель и так прописывается в стартап-коде в секции .init2. Если выкинуть .init2, программа рушится на возврате из первого же конструктора в .init6 или на возврате из первой же пользовательской функции в .init3-.init8. Проверил. На 20070525 не работает вообще. Но есть решение: можно передать начальный адрес как значение символа __stack: Код LDFLAGS += -Wl,--defsym,__stack=0x100 Тогда этот адрес будет подставлен в .init2 без всяких накладных расходов.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Dec 19 2008, 12:12
|

Местный
  
Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423

|
Цитата(mdmitry @ Dec 19 2008, 16:05)  Посмотрите файлы delay_basic.h и delay.h. Должно помочь. Изучение заголовочных файлов и описания avr-libc мне сильно помогло. это перенесётся на IAR согласен Код void _delay_ms(double __ms) { uint16_t __ticks; double __tmp = ((F_CPU) / 4e3) * __ms; if (__tmp < 1.0) __ticks = 1; else if (__tmp > 65535) { // __ticks = requested delay in 1/10 ms __ticks = (uint16_t) (__ms * 10.0); while(__ticks) { // wait 1/10 ms _delay_loop_2(((F_CPU) / 4e3) / 10); __ticks --; } return; } else __ticks = (uint16_t)__tmp; _delay_loop_2(__ticks); } а как быть с этим Код void _delay_loop_2(uint16_t __count) { __asm__ volatile ( "1: sbiw %0,1" "\n\t" "brne 1b" : "=w" (__count) : "0" (__count) ); } я, в асме из под IAR несилён, подскажите как это можно под IAR переписать ?
Сообщение отредактировал west329_ - Dec 19 2008, 12:14
|
|
|
|
|
Dec 19 2008, 14:06
|

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

|
Цитата(west329_ @ Dec 19 2008, 14:12)  я, в асме из под IAR несилён, подскажите как это можно под IAR переписать ? Код _delay_ms(double __ms) = __delay_cycles(__ms * F_CPU / 1000)
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Dec 19 2008, 16:28
|

Местный
  
Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423

|
Цитата(Сергей Борщ @ Dec 19 2008, 18:06)  Код _delay_ms(double __ms) = __delay_cycles(__ms * F_CPU / 1000) у меня ИАР отказывается собирать Код Fatal Error[Ta030]: Argument to __delay_cycles must be a constant expression. посмотрел в описании __delay_cycles Код __intrinsic void __delay_cycles(unsigned long); ругается на то что __ms переменная а не константа, подскажите что делать ?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|