Страницы

Поиск по вопросам

Показаны сообщения с ярлыком avr-gcc. Показать все сообщения
Показаны сообщения с ярлыком avr-gcc. Показать все сообщения

вторник, 17 марта 2020 г.

Как в Atmel Studio 6 разместить массив во flash памяти?

#c #массивы #avr_gcc #atmel_studio #flash_память


Например, есть массив:
unsigned int tabz[] = {64, 128, 256, 512, 1024, 2048, 4096};

В CodeVisionAVR, чтобы разместить этот массив во flash, надо написать так:
flash unsigned int tabz[] = {64, 128, 256, 512, 1024, 2048, 4096};

В Atmel Studio 6 так нельзя.
Как в Atmel Studio 6 разместить массив во flash памяти?    


Ответы

Ответ 1



Для flash-памяти необходимо объявлять так: const unsigned char Scena[4] PROGMEM = {1,2,3,4} Обязательно указывать const, иначе пихает в ОЗУ!

Ответ 2



Пример для AVR GNU: #include #include uint8_t string[12] PROGMEM = {"hello world!"}; int main(void) { UDR0 = pgm_read_byte(&string[10]); }

среда, 25 декабря 2019 г.

Использование c++ в микроконтроллерах

#cpp #avr_gcc #микроконтроллеры


Подскажите пожалуйста, можно ли использовать C++ для программирования микроконтроллеров? 
Есть ли при этом какие либо ограничения для языка C++?    


Ответы

Ответ 1



использовать часто можно, но нужно смотреть на конкретную реализацию. К примеру, может не быть исключений. С другой стороны, с++ приносит определенный оверхед, а на микроконтроллерах часто бывает важный каждый байт, это не java c большими серверами, где можно докупить планку-другую. Но микроконтроллеры не стоят на месте и развиваются, как собственно и компиляторы. Возможно, для Вашего контроллера и Вашего случае С++ - лучший вариант.

Ответ 2



На самом деле никаких ограничений нет, просто нужен правильный скрипт линковщика с соответствующими секциями для поддержки исключений и виртуальных методов, а так-же релизация аллокаторов/деаллокаторов и STL (конечно это роскошь?). Найти какой скрипт в сети не сложно...

Ответ 3



C++ не только можно, но и нужно использовать для программирования микроконтроллеров. Как тут писалось, никаких исключений и операторов new. Для отмены исключений есть даже флаг компилятора, специально для нас. Чем С++ лучше си: Строгая типизация. Если что-то не так, получите ошибку при компиляции, а не поиск её в отладке. Наглядный пример, если в функцию передаётся тип перечисления, а вы в си вписали что-то не то (int, к примеру), то в си вы пройдёте компиляцию, в C++ получите ошибку компиляции. Ссылки. Философия С++: "не плати за то, что тебе не нужно". Ссылки не занимают место в памяти, код с ссылками смотрится аккуратнее, чем код с указателями. Всегда можно забыть поставить * или &. Классы (структуры). Банально удобно описывать не только саму структуру, но и действия с ней. Каждый регистр можно обернуть в классовую обёртку с методами, которые своим названием указывают, что вы делаете. Если код необходимо много комментировать, то это плохой код. Объекты. В функцию (класс, метод класса) можно передать ссылку на объект вывода микроконтроллера, а не писать кучу дефайнов всех регистров (легко ошибиться, много исправлять, особенно для всяких stm32). Шаблоны. Забудьте про многострочные макросы, ошибки в которых отладить крайне сложно, дебагер в них просто не войдёт. Шаблоны куда лучше препроцессора. Оверхеда нет. Это распространённый миф. Грамотный код, написанный на с++ даёт меньший объём бинарников, натыкался на исследования, даже ролики с конференций есть на ютьюбе. (полагаю всему виной ссылки вместо указателей и оптимизация шаблонов).

Ответ 4



Посмотрите на язык Wiring, используемый в Arduino. Это C++ без стандартной библиотеки и исключений, со своей специальной библиотекой. Компилируется он, кстати, упомянутым у вас в тегах avr-gcc.

понедельник, 16 декабря 2019 г.

Инверсия в C - Код для AVR

#c #avr_gcc #avr


Наверное очень глупый вопрос, но разбирая код простой программы на Си для AVR, я
столкнулся  с такой проблемой:

int main(void)
{
DDRA = 0xFF; // Выставляем порт А как выход

for(;;){
PORTA = ~0x21; // Включаем LED на PA0 и PA5
_delay_ms(10000);
// и.т.д.
}


В коментариях к программе указано что PORTA = ~0x21; должен включить PA0 и PA5.
Насколько я понимаю, 0х21 = 00100001, ~0x21 = 11011110. А это значить выходы PA0
и PA5 как раз не должны иметь напряжения. 

Помогите пожалуйста разобраться! Спасибо!


    


Ответы

Ответ 1



В данном случае используется инверсное включение светодиода. Соответственно для протекания тока через него вывод переводится в "0". (Внутри МК открывается полевой транзистор, соединяющий вывод с "землёй"). Сделано это, видимо, из соображений безопасности. Если бы светодиоды были подключены обратно, при включении всех их вместе возможна перегрузка порта(A ,С) МК по току. Такие ограничения следует учитывать, подключая нагрузки напрямую к портам без ключевого транзистора/буферной iC.

вторник, 27 ноября 2018 г.

Использование c++ в микроконтроллерах

Подскажите пожалуйста, можно ли использовать C++ для программирования микроконтроллеров? Есть ли при этом какие либо ограничения для языка C++?


Ответ

использовать часто можно, но нужно смотреть на конкретную реализацию. К примеру, может не быть исключений. С другой стороны, с++ приносит определенный оверхед, а на микроконтроллерах часто бывает важный каждый байт, это не java c большими серверами, где можно докупить планку-другую. Но микроконтроллеры не стоят на месте и развиваются, как собственно и компиляторы. Возможно, для Вашего контроллера и Вашего случае С++ - лучший вариант.