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

 
 
 
Reply to this topicStart new topic
> Подскажите где в WinAVR задаётся размер стека ?, Перевожу программу с WinAVR на IAR AVR
west329_
сообщение Dec 19 2008, 08:41
Сообщение #1


Местный
***

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



Перевожу программу с WinAVR на IAR AVR.

Проект нормально собирается в WinAVR-2007122 в Programmers Notepad.

Первой что непонятно, в иаре чётко надо указывать стек для контроллера, перерыл все исходники WinAVR и make файл, ничего чтоб указывало на стек ненашол ? подскажите как быть ?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 19 2008, 08:51
Сообщение #2


Гуру
******

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



Цитата(west329_ @ Dec 19 2008, 10:41) *
перерыл все исходники WinAVR и make файл, ничего чтоб указывало на стек ненашол ? подскажите как быть ?
Читать описание на avr-libc (index.html->User Manual->Memory Areas and Using malloc()). Указатель стека ставится на конец набортного ОЗУ. Под стек отводится вся оставшаяся свободной набортная память.


--------------------
На любой вопрос даю любой ответ
"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
west329_
сообщение Dec 19 2008, 09:55
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Dec 19 2008, 09:59
Сообщение #4


;
******

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 19 2008, 10:54
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
west329_
сообщение Dec 19 2008, 11:06
Сообщение #6


Местный
***

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



Работо по переделки prog_char немного приостановил, за ненадобность в данный момент этих процедур.

Появился вопрос по функциям _delay_ms() _delay_us;

Подскажите простенький дефайн на С, который бы молотил пустые цыклы NOP() исходя из заданных параметров F_CPU ?

Пару раз встречал , но както недогодался сохранить.
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Dec 19 2008, 12:05
Сообщение #7


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



Цитата(west329_ @ Dec 19 2008, 14:06) *
Подскажите простенький дефайн на С, который бы молотил пустые цыклы NOP() исходя из заданных параметров F_CPU ?

Пару раз встречал , но както недогодался сохранить.

Посмотрите файлы delay_basic.h и delay.h. Должно помочь. Изучение заголовочных файлов и описания avr-libc мне сильно помогло.


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
west329_
сообщение Dec 19 2008, 12:12
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Dec 19 2008, 12:24
Сообщение #9


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(Сергей Борщ @ Dec 19 2008, 14:54) *
Проверил. На 20070525 не работает вообще.

В 20081205 тоже, оказывается, не работает sad.gif
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 19 2008, 14:06
Сообщение #10


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
west329_
сообщение Dec 19 2008, 16:28
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 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 переменная а не константа, подскажите что делать ?
Go to the top of the page
 
+Quote Post
SysRq
сообщение Dec 19 2008, 19:56
Сообщение #12


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Цитата(west329_ @ Dec 19 2008, 19:28) *
ругается на то что __ms переменная а не константа, подскажите что делать ?

Дать константу, как просит.
Переменную можете оформить себе сами в виде цикла с вызовом внутри него __delay_cycles() с необходимой константой (учтите поправку на сам цикл).
Go to the top of the page
 
+Quote Post

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

 


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


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