Страница 1 из 7
Переход от асма к си
Добавлено: Вс авг 28, 2016 10:58:12
СЦБист
Добрый день !
Потихоньку решил переходить на си.
В заголовочном файле есть такая строка
чему равно значение
_SFR_IO8 ?
Re: Переход от асма к си
Добавлено: Вс авг 28, 2016 11:03:18
Vov123
PORTB
Re: Переход от асма к си
Добавлено: Вс авг 28, 2016 11:15:38
СЦБист
нет.
PORTB равно _SFR_IO8(0x18)
а я спросил чему равно _SFR_IO8(
Re: Переход от асма к си
Добавлено: Вс авг 28, 2016 11:27:33
Morroc
# if __AVR_ARCH__ >= 100
# define __SFR_OFFSET 0x00
# else
# define __SFR_OFFSET 0x20
# endif
#endif
#define _SFR_IO8(io_addr) ((io_addr) + __SFR_OFFSET)
Re: Переход от асма к си
Добавлено: Вс авг 28, 2016 11:29:13
Аlex
Оно ничего ничему не равно. Это дефайны !
Re: Переход от асма к си
Добавлено: Вс авг 28, 2016 11:42:44
СЦБист
Morroc если в результате преобразования
PORTB это эквивалент ((0x18) + 0x00)
то какого лешего по адресу можно выполнить
PORTB = 67;
PORTB в данном случае выступает в роле указателя
следовательно
*PORTB = 67;
а че у меня нету определения _SFR_IO8 ?
Re: Переход от асма к си
Добавлено: Вс авг 28, 2016 13:12:05
Morroc
я тут нашел sfr_defs.h
Re: Переход от асма к си
Добавлено: Вс авг 28, 2016 13:16:16
СЦБист
у меня этого чуда нету в проекте.
в iom8.h нету определения _SFR_IO8
но склоняюсь что оно должно быть примерно таким
#define _SFR_IO8 *(int *)
Re: Переход от асма к си
Добавлено: Вс авг 28, 2016 13:40:21
Kavka
СЦБист писал(а):а че у меня нету определения _SFR_IO8 ?
Потому что не инклюдят в Си эти инклюдники.
Надо в свойствах проекта указать МК, а в исходнике сделать #include <avr/io.h>
Тогда всё автоматом подключится
Re: Переход от асма к си
Добавлено: Вс авг 28, 2016 13:47:05
СЦБист
сейчас вопрос не по <avr/io.h> а по
#define _SFR_IO8 *(int *)
все же выше написано
Re: Переход от асма к си
Добавлено: Пн авг 29, 2016 06:42:35
COKPOWEHEU
Morroc уже ответил. Открываешь директорию со стандартными заголовочниками и последовательно перебираешь все, которые подключены к проекту. Там довольно быстро находится sfr_defs.h, в котором интересующий тебя макрос описан.
Re: Переход от асма к си
Добавлено: Пн авг 29, 2016 11:01:05
СЦБист
Это уже похоже на правду
Код: Выделить всё
#define _MMIO_BYTE(mem_addr) (*(volatile uint8_t *)(mem_addr))
Заметил что тип int - 2 байта
float и double 4 байта
Разве int не 4 а double не 8 ?
Re: Переход от асма к си
Добавлено: Пн авг 29, 2016 14:06:01
ARV
СЦБист писал(а):Заметил что тип int - 2 байта
float и double 4 байта
Разве int не 4 а double не 8 ?
размер int стандартом Си не определен и является платформозависимым. для 8-битной платформы AVR он принят двухбайтным. во избежание недоразумений очень-очень рекомендую всегда использовать платформонезависимые типы данных, определенные стандартом С99 (и, разумеется, всегда использовать компиляцию с поддержкой этого стандарта):
int
NN_t - знаковый
uint
NN_t - беззнаковый, где NN =
8,
16,
32 или
64 определяет соответственно количество битов в числе. 64-битные числа не рекомендую применять, т.к. avr-gcc генерирует для них крайне громоздкий код (во всяком случае версия WinAVR-20100110)
особенностью AVR-GCC так же является тот факт, что double полностью эквивалентно float, т.е. между ними нет никакой разницы.
Re: Переход от асма к си
Добавлено: Пн авг 29, 2016 14:19:25
СЦБист
в Microsoft Visual Studio 2010 int 4 байта занимает но это не важно .
решил поиграться с компилятором и написал такую структуру
Код: Выделить всё
struct A
{
uint8_t a;
uint16_t b;
uint32_t c;
uint64_t d;
};
в главной функции динамически выделил память
Код: Выделить всё
struct A *a = (struct A *)malloc(sizeof(struct A));
в контроллерах это выделение приветствуется ?
потом освободил
как я понял new и delete тут не работает ((( классы тоже
Re: Переход от асма к си
Добавлено: Пн авг 29, 2016 15:31:38
ARV
СЦБист писал(а):new и delete тут не работает ((( классы тоже
во-первых, классы работают, но в С++, а не в С.
во-вторых, динамическое выделение памяти в контроллерах с жалкими сотнями байт ОЗУ - это извращение еще то. но оно работает, если подключить stdlib.h
в-третьих, new и delete, если вы про классы, вообще неразумно применять, т.к. в мизерном ОЗУ генерация динамических экземпляров классов будет порождать дикий код по объему. экземпляры классов для AVR разумно применять только статические.
вы бы как-то определились: вам Си или С++, для МК или вообще... не все плюшки Си (и тем более С++) разумно применять в МК, тем более в AVR.
Re: Переход от асма к си
Добавлено: Вс сен 04, 2016 13:56:15
СЦБист
С++ это расширение Си не более того.
Компилятор АУДрино использует именно классы.
следовательно там чистый ++.
так что, динамика тут не нужно чтоль ?
а если мне в процессе работы программы больше не понадобятся использование большого
массива структур , на кой хрен мне засирать память ?
********************
для нормальной работы вызова обработчиков прерываний , нужно тулить эту конструкцию ?
Код: Выделить всё
ldi R16,Low(RAMEND) ;èíèöèàëèçàöèÿ ñòåêà
out SPL,R16
ldi R16,High(RAMEND) ;èíèöèàëèçàöèÿ ñòåêà
out SPH,R16
как это на си будет ?
можно в принципе через асм вставки
Re: Переход от асма к си
Добавлено: Вс сен 04, 2016 16:19:32
uk8amk
СЦБист писал(а):так что, динамика тут не нужно чтоль ?
Ктож против, используйте если надо.
СЦБист писал(а):нужно тулить эту конструкцию ?
Как правило это не требуется и скрыто от СИшного программиста. Но при острой необходимости можно поковыряться в startup файле и поменять чего надо.
Re: Переход от асма к си
Добавлено: Ср сен 07, 2016 11:54:43
COKPOWEHEU
С++ это расширение Си не более того.
Подтвердить не могу, но это разные языки, хотя и похожие.
так что, динамика тут не нужно чтоль ?
а если мне в процессе работы программы больше не понадобятся использование большого
массива структур , на кой хрен мне засирать память ?
Ограничивать область видимости переменных, либо разместить несколько переменных в пересекающихся областях памяти вручную.
для нормальной работы вызова обработчиков прерываний , нужно тулить эту конструкцию ?
Не нужно, компилятор ее вставляет самостоятельно.
Re: Переход от асма к си
Добавлено: Сб сен 10, 2016 13:08:58
СЦБист
COKPOWEHEU писал(а):[ нужно, компилятор ее вставляет самостоятельно.
[/quote]
а че на асме такой малины в студии нету ?
флаг I выставлять хоть надо вручную ?
Re: Переход от асма к си
Добавлено: Сб сен 10, 2016 14:23:31
COKPOWEHEU
Наверное я не понял вопрос, но.
Асм - почти машинные коды, что написано, то камень и сделает. Дословно. Без своеволия.
ЯВУ (в том числе Си) освобождает программиста от рутины - работы со стеком, реализации стандартных структур и так далее. За это приходится расплачиваться своеволием компилятора (в общем случае нельзя сказать во что развернется та или иная команда) и в среднем несколько менее быстрым и компактным кодом.
Иначе говоря, компилятор ЯВУ сам добавляет инициализацию стека, некоторой переферии, некоторых переменных. На асме это делается руками.