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

Обсуждаем контроллеры компании Atmel.
Ответить
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1337
Зарегистрирован: Сб июн 09, 2012 02:14:11
Откуда: ХАРЬКОВ

Сообщение СЦБист »

Добрый день !

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

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

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

#define PORTB	_SFR_IO8(0x18)

чему равно значение _SFR_IO8 ?
Реклама
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

Сообщение Vov123 »

PORTB
Реклама
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1337
Зарегистрирован: Сб июн 09, 2012 02:14:11
Откуда: ХАРЬКОВ

Сообщение СЦБист »

нет.

PORTB равно _SFR_IO8(0x18)

а я спросил чему равно _SFR_IO8(
Друг Кота
Сообщения: 19495
Зарегистрирован: Чт фев 20, 2014 18:57:55

Сообщение 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)
Последний раз редактировалось Morroc Вс авг 28, 2016 11:29:43, всего редактировалось 1 раз.
"Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл /
"Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /
Реклама
Эиком - электронные компоненты и радиодетали
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Оно ничего ничему не равно. Это дефайны !
Реклама
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1337
Зарегистрирован: Сб июн 09, 2012 02:14:11
Откуда: ХАРЬКОВ

Сообщение СЦБист »

Morroc если в результате преобразования

PORTB это эквивалент ((0x18) + 0x00)

то какого лешего по адресу можно выполнить

PORTB = 67;

PORTB в данном случае выступает в роле указателя

следовательно

*PORTB = 67;


а че у меня нету определения _SFR_IO8 ?
Вложения
Безымянный.JPG
(108.94 КБ) 629 скачиваний
Реклама
Друг Кота
Сообщения: 19495
Зарегистрирован: Чт фев 20, 2014 18:57:55

Сообщение Morroc »

я тут нашел sfr_defs.h
"Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл /
"Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1337
Зарегистрирован: Сб июн 09, 2012 02:14:11
Откуда: ХАРЬКОВ

Сообщение СЦБист »

у меня этого чуда нету в проекте.

в iom8.h нету определения _SFR_IO8

но склоняюсь что оно должно быть примерно таким

#define _SFR_IO8 *(int *)
Мудрый кот
Аватара пользователя
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

СЦБист писал(а):а че у меня нету определения _SFR_IO8 ?
Потому что не инклюдят в Си эти инклюдники.
Надо в свойствах проекта указать МК, а в исходнике сделать #include <avr/io.h>
Тогда всё автоматом подключится
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1337
Зарегистрирован: Сб июн 09, 2012 02:14:11
Откуда: ХАРЬКОВ

Сообщение СЦБист »

сейчас вопрос не по <avr/io.h> а по

#define _SFR_IO8 *(int *)

все же выше написано
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

Morroc уже ответил. Открываешь директорию со стандартными заголовочниками и последовательно перебираешь все, которые подключены к проекту. Там довольно быстро находится sfr_defs.h, в котором интересующий тебя макрос описан.
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1337
Зарегистрирован: Сб июн 09, 2012 02:14:11
Откуда: ХАРЬКОВ

Сообщение СЦБист »

Это уже похоже на правду

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

#define _MMIO_BYTE(mem_addr) (*(volatile uint8_t *)(mem_addr))

Заметил что тип int - 2 байта

float и double 4 байта

Разве int не 4 а double не 8 ?
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение 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, т.е. между ними нет никакой разницы.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1337
Зарегистрирован: Сб июн 09, 2012 02:14:11
Откуда: ХАРЬКОВ

Сообщение СЦБист »

в 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 тут не работает ((( классы тоже
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

СЦБист писал(а):new и delete тут не работает ((( классы тоже
во-первых, классы работают, но в С++, а не в С.
во-вторых, динамическое выделение памяти в контроллерах с жалкими сотнями байт ОЗУ - это извращение еще то. но оно работает, если подключить stdlib.h
в-третьих, new и delete, если вы про классы, вообще неразумно применять, т.к. в мизерном ОЗУ генерация динамических экземпляров классов будет порождать дикий код по объему. экземпляры классов для AVR разумно применять только статические.

вы бы как-то определились: вам Си или С++, для МК или вообще... не все плюшки Си (и тем более С++) разумно применять в МК, тем более в AVR.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1337
Зарегистрирован: Сб июн 09, 2012 02:14:11
Откуда: ХАРЬКОВ

Сообщение СЦБист »

С++ это расширение Си не более того.

Компилятор АУДрино использует именно классы.

следовательно там чистый ++.

так что, динамика тут не нужно чтоль ?

а если мне в процессе работы программы больше не понадобятся использование большого

массива структур , на кой хрен мне засирать память ?

********************

для нормальной работы вызова обработчиков прерываний , нужно тулить эту конструкцию ?

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

ldi R16,Low(RAMEND)  ;èíèöèàëèçàöèÿ ñòåêà 
              out SPL,R16      
 
              ldi R16,High(RAMEND) ;èíèöèàëèçàöèÿ ñòåêà 
              out SPH,R16
как это на си будет ?

можно в принципе через асм вставки
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Сообщение uk8amk »

СЦБист писал(а):так что, динамика тут не нужно чтоль ?
Ктож против, используйте если надо.
СЦБист писал(а):нужно тулить эту конструкцию ?
Как правило это не требуется и скрыто от СИшного программиста. Но при острой необходимости можно поковыряться в startup файле и поменять чего надо.
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

С++ это расширение Си не более того.
Подтвердить не могу, но это разные языки, хотя и похожие.
так что, динамика тут не нужно чтоль ?
а если мне в процессе работы программы больше не понадобятся использование большого
массива структур , на кой хрен мне засирать память ?
Ограничивать область видимости переменных, либо разместить несколько переменных в пересекающихся областях памяти вручную.
для нормальной работы вызова обработчиков прерываний , нужно тулить эту конструкцию ?
Не нужно, компилятор ее вставляет самостоятельно.
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1337
Зарегистрирован: Сб июн 09, 2012 02:14:11
Откуда: ХАРЬКОВ

Сообщение СЦБист »

COKPOWEHEU писал(а):[ нужно, компилятор ее вставляет самостоятельно.
[/quote]


а че на асме такой малины в студии нету ?

флаг I выставлять хоть надо вручную ?
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

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

Вернуться в «AVR»