Страница 1 из 7

Переход от асма к си

Добавлено: Вс авг 28, 2016 10:58:12
СЦБист
Добрый день !

Потихоньку решил переходить на си.

В заголовочном файле есть такая строка

Код: Выделить всё

#define PORTB	_SFR_IO8(0x18)

чему равно значение _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 (и, разумеется, всегда использовать компиляцию с поддержкой этого стандарта):
intNN_t - знаковый
uintNN_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));
в контроллерах это выделение приветствуется ?

потом освободил

Код: Выделить всё

free(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
Наверное я не понял вопрос, но.
Асм - почти машинные коды, что написано, то камень и сделает. Дословно. Без своеволия.
ЯВУ (в том числе Си) освобождает программиста от рутины - работы со стеком, реализации стандартных структур и так далее. За это приходится расплачиваться своеволием компилятора (в общем случае нельзя сказать во что развернется та или иная команда) и в среднем несколько менее быстрым и компактным кодом.
Иначе говоря, компилятор ЯВУ сам добавляет инициализацию стека, некоторой переферии, некоторых переменных. На асме это делается руками.