Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



Язык Си

Сообщений 1 страница 30 из 52

1

На данный момент наиболее оптимальный язык для STM32 это Си, потому что баскома к сожалению нет, а mikroBasic оставляет желать лучшего.
Значит нужно писать на Си. На самом деле язык не такой сложный как может показаться на первый взгляд. Трудности могут вызвать разве что указатели.
Рассказывать все о языке слишком долго. Кому интересно можете прочитать какую-то книжку для "чайников" начинающих, например эту (читать до 139 страницы) http://rgho.st/private/6r8Bb9mdP/c94003 … 045ca42438
Здесь же напишу только кратко и проведу небольшое сравнение к кодом баскома.
Начну с типов переменных.

Тип

Количество байт

Аналог в баскоме

uint8_t, int8_t

1

Byte

uint16_t, int16_t

2

Word, Integer

uint32_t, int32_t

4

Dword, Long

uint64_t, int64_t

8

float        (плавающая точка)

4

Single

double     (плавающая точка)

8

Double

Все довольно просто. В целочисленных типах, число указывает сколько бит будет занимать переменная с этим типом, т. е. uint8_t - 8 бит или 1 байт. uint32_t - 32 бита или 4 байта. Если имя типа начинается с u это означает что тип беззнаковый (число не может быть отрицательным).

Оператор if (и другие условные операторы) похож на аналогичный в баском, но имеет особенности. Условие должно быть в скобках, т. е.

Код:
if (x>0)

Проверка на "не 0"

Код:
if (x != 0)

Проверка на равенство нулю

Код:
if (x == 0)

Внимание грабли! Если попытаетесь выполнить сравнение таким образом

Код:
if (x = 2)

то результат будет совсем не тот что ожидается. Вместо того чтобы сравнить число в переменой на равенство 2, в переменную будет записано это число.

Когда в результате проверки условия нужно выполнить одно действие, то можно код написать таким образом

Код:
if (x>0) x=0;

Или

Код:
if (x>0) 
    x=0;

Или

Код:
if (x>0)
{
    x=0;
}

Если нужно выполнить несколько действий то следует использовать только вариант с фигурными скобками

Код:
if (x>0)
{
    x=0;
    y = y + 10;
}

Эти фигурные скобки многим не нравятся и возможно даже вызывают недопонимание устройства кода. Если в двух словах, то они нужны для выделения кода в блок. В данном случае, они выделяют несколько действий в один блок который принадлежит оператору if.
Точка с запятой разделяет отдельные действия. Т. е. в баксоме они разделяются новой строкой, а в Си точкой с запятой.

Цикл for

Код:
for (x=0; x<10; x=x+1)

Опять же нужно все что касается цикла писать в круглых скобках. Сперва задается начальное значение счетчика цикла. Затем после точки с запятой условие окончания цикла, а после располагается код увеличения значения счетчика цикла. Как и в случае с оператором if, при одном действии его можно написать без фигурных скобок.

Код:
for (x=0; x<10; x=x+1) z = x * 10;

Или

Код:
for (x=0; x<10; x=x+1) 
    z = x * 10;

Если действий больше одного, то необходимы фигурные скобки.

Код:
for (x=0; x<10; x=x+1)
{
    z = x * 10;
    m = x * z + 100;
}

В отличие от баскома, при объявлении переменной не используется оператор Dim. Сделано проще. Сначала располагается тип переменной, а после сама переменная.

Код:
uint8_t x = 0;

Пример функции

Код:
uint8_t Test(uint8_t x)
{
    return x + 10;
}

И аналогичная на баскоме.

Код:
function Test(byval x As Byte) as byte
  Test = x + 10
end function

+6

2

СУПЕР !!!

И главное, простым языком !

0

3

что главное? главное библиотеки...

0

4

писать с нуля всё самому уже не кошерно :)
какая я там версия Windows вышла дцать лет назад без драйверов с напутствием: ДА программисты сами себе драйвера напишут!
и та версия проволилась в продаже, так как оказалось, что программистам есть чем заняться более интересным и оплачиваемым, чем самим себе писать драйвера...

0

5

Александр Д. написал(а):

главное библиотеки

Для периферии они есть (SPL и HAL). Используя SPL мне редко приходится заглядывать в документацию на МК.
Или речь про другие библиотеки?

0

6

я про конкретный компилятор говорил, который применять для STM32
работа с железом: 1wire, LCD, Изернетом и прочими вкусняшками, хотя бы теми, которые поддерживает Баском

0

7

1wire есть STM32 и 1Wire
Для многих LCD также можно найти библиотеки. А если нет, то всегда можно написать свою Дисплей с контроллером S6D1121
Если разобраться то библиотек гораздо больше чем у баскома. Например есть бесплатные для USB, Ethernet (для МК со встроенным Ethernet модулем) и многое другое. Есть несколько вариантов ОС реального времени и т. д.

0

8

ОС для МК я еще не щупал - задач таких нет, где бы я видел смысл использования оных
коллега, который пишет под STM32 и использует ОС, имеет куда больше гемора и дольше делает проекты. Хотя зачастую они гораздо сложнее. Но всё равно я пока не вижу смысла в ОС.

0

9

Зачем нужна ОС я писал вначале этой темы STM32F103C8T6 - FreeRTOS
Во многих проектах есть задержки во время которых МК только потребляет ток. В это время МК мог выполнять другую задачу или "спать". Задача ОСи - более рациональное использование ресурсов МК.

STM32 гораздо превосходят обычные меги как по производительности, так и по возможностям периферии. С ними могут сравнится разве что XMEGA (если не учитывать что этот МК 8-ми битный и имеет меньшую тактовую частоту) и AVR32, но их цена гораздо выше чем у STM32. И если XMEGA поддерживается баскомом, то AVR32 уже нет. Также баском не поддерживает аппаратную отладку.

0

10

аппаратной отладкой ни разу не пользовался. Понимаю что и как, но привычка :)

0

11

Отладка вещь хорошая и после некоторого времени использования понимаешь что она существенно упрощает не только поиск ошибок в коде, но и изучение МК. Мне при разработке прог для компа часто приходится их отлаживать и понимаю что для чего нужно. Если опыта отладки нет, то возможно недооцениваются ее преимущества. Я раньше показывал некоторые из возможностей отладки Отладка программы Можно посмотреть что в регистрах процессора и периферии, ОЗУ и т. д., пошагово выполнить программу убедившись в верности алгоритма или правильности понимания работы МК и все это без перекомпиляции программы. Экономится много времени и ресурса флеша по сравнению с выводом отладочной информации через USART.

0

12

Супер!
А по условной компиляции ликбез будет?
И про расширения тоже бы не плохо почитать.

0

13

-NMi- написал(а):

А по условной компиляции ликбез будет?

Условное выполнение кода.

Код:
#define x 0

#if x == 0
  // Код
#endif

Код между #if и #endif будет выполнен только если в дефайне x будет 0. В #if те же правила построения сравнения что в операторе if за исключением отсутствия необходимости скобок (как круглых так и фигурных).
Если нужно выполнить код только при наличии в коде дефайна с определенным именем следует использовать #ifdef

Код:
#ifdef x
  // Код
#endif

Если дефайн x нигде не объявлен, то код между #ifdef и #endif выполнен не будет.
Есть аналогичный условный оператор #ifndef который проверяет отсутствие дефайна и если его нет, код выполнится между #ifndef и endif.

-NMi- написал(а):

И про расширения тоже бы не плохо почитать.

В Си два расширения файлов - *.c и *.h. В первых находится исполняемый код (в основном функции), а во вторых только то что должно экспортироваться из *.c файла. Обычно это дефайны, прототипы функций, шаблоны структур и экспортируемые переменные.
Директивой #include обычно подключаются только *.h файлы но не *.c. Используется метод раздельной компиляции. Т. е. все файлы добавляются в проект и *.c компилируются отдельно друг от друга. Такой подход позволяет во первых сократить время компиляции если были изменены не все файлы а лишь часть, компилируются только измененные файлы. Кроме того раздельный метод компиляции позволяет запустить несколько процессов компилятора и увеличить скорость сборки за счет многоядерности процессоров (этот метод использован в EmBitz и существенно сокращает время сборки по сравнению с однопоточной компиляцией).
Есть правило что у каждого *.c должен быть *.h в который помещается все что экспортируется из *.c файла, т. е. прототипы функций, шаблоны структур, дефайны, переменные со спецификатором extern и т. д. Если из одного *.c нужно работать с кодом другого *.c файла, то следует в первом подключить *.h от второго *.c файла.
Возможно это кажется запутанным и нелогичным, но такой подход позволяет не только ускорить компиляцию, но и частично изолировать код одного *.c файла или другого.

0

14

такой подход позволяет не только ускорить компиляцию, но и частично изолировать код одного *.c файла или другого.
т.е, в каждом Си-файле я могу использовать переменные с одним именем?

0

15

Александр Д. написал(а):

т.е, в каждом Си-файле я могу использовать переменные с одним именем?

Да.
Также если функции объявлять с ключевым словом static то они могут иметь одно и тоже имя в нескольких файлах.

0

16

И переменные там все ЛОКАЛЬНЫЕ, глобальные задаются ОТДЕЛЬНО.
С одной стороны это очень удобно, но с другой...
Например:
#include lcd
#include keyboard
#include unit
#include main_code

И всё, вот и весь код программы!   А уже во вложениях путём условной компиляции выбирается железо! Удобно?  А вот "расковыривать" после кого-то эти условные компиляции ой как не легко.

0

17

-NMi- написал(а):

И переменные там все ЛОКАЛЬНЫЕ, глобальные задаются ОТДЕЛЬНО.

Это не так. В любом файле можно написать extern переменная.
Простейший пример. В файле system_stm32fxxx.c (например system_stm32f10x.c) есть переменная SystemCoreClock хранящая текущую тактовую ядра. В любом другом файле можно написать

Код:
extern uint32_t SystemCoreClock;

и получить доступ к переменной.

0

18

Молодец Пётр. :cool:
Тащи нас лентяев к светлому будущему вмести с С. Обленились понимаешь ли, до сих пор Бейсик лабаем. :crazyfun:
А если серьёзно, то сам язык конечно не очень сложен, дело привычки и библиотек там просто немеряно и наработок других программистов. Баском в этом конечно сильно уступает.
Начну с того, что пробовал следующие компиляторы.
1. IAR AVR после двух недель попыток что нибудь понять и написать снёс его к чёртовой матери. Очень замороченный и непонятный. Моё личное мнение.
2. WinAVR GCC Весьма мощный, кроссплатформенный, легко интегрируется в AVR STudio, но нужно тоже изрядно попотеть чтобы разобраться. Особой трудностью для начинающих  будет создание Makefile без которого не соберёшь проект. Как таковой среды разработки нет. Есть текстовый редактор и программа для создания Mаkefile. Огромным плюсом этой среды наличие бесчисленного множества программ и библиотек для неё. Лично я использовал в своих разработках знаменитую Lufa для обмена по USB. Ещё одной заморочкой этого компилятора является размер кода. Куча различных режимов оптимизации даёт огромный разброс размера. С этим надо серьёзно бороться.
3. Ну и знаменитый CodeVision AVR C. Самый простой из всех мною использованных. Действительно весьма наглядно и всё в одной программе. Изучив азы С можно спокойно работать на нём. Особое внимание на оптимизацию, иначе получите бяку. Большое достоинство огромное количество программ написанных другими.
При переходе на С сразу необходимо внимательно изучить стандартные библиотеки. Особенно ввод и вывод, а сам язык весьма прост.
Вот вкратце и всё.

+1

19

CodeVision AVR C нет смысла рассматривать, так как он только под AVR
потому-то и не прыгают массово на STM32 (да и STM8) из-за куцести средств разработки (компиляторов)
Или цена безбожная, или какчество - сделай сам, ты же линуксоид!

0

20

sva-don написал(а):

Особой трудностью для начинающих  будет создание Makefile без которого не соберёшь проект.

При интеграции с AVR Studio в этом нет необходимости. :)

sva-don написал(а):

Ещё одной заморочкой этого компилятора является размер кода. Куча различных режимов оптимизации даёт огромный разброс размера.

Не самом деле все проще. Оптимизация -O0 только при необходимости отладки кода, поскольку в этом режиме она (оптимизация) вообще отсутствует и получаем сильно "раздутый" и относительно медленно работающий код.
Наиболее приемлемые оптимизации это -O2 в большинстве случаев, -Os если нужен минимальный размер кода и -Ofast если нужна максимальная скорость выполнения.
Можно задать уровень оптимизации не только для всего проекта или *.c файла, но и для отдельных функций с помощью атрибута

Код:
__attribute__((optimize("-Ofast")))

Например таким образом можно немного ускорить функции выполняемые в прерывании.
Про оптимизацию я кратко рассказывал в теме EmBitz

sva-don написал(а):

При переходе на С сразу необходимо внимательно изучить стандартные библиотеки. Особенно ввод и вывод

При работе с STM32 у меня такой необходимости почти не возникало. Пару раз приходилось работать с функцией sprintf и с функцией sqrt. Гораздо важнее изучить библиотеки SPL или HAL, но при работе непосредственно с регистрами в этом нет необходимости.

Александр Д. написал(а):

потому-то и не прыгают массово на STM32 (да и STM8) из-за куцести средств разработки (компиляторов)

В чем заключается эта куцесть?

Александр Д. написал(а):

Или цена безбожная, или какчество - сделай сам, ты же линуксоид!

Я бы так не сказал. В EmBitz добавил только инструмент для прошивки МК и создания bin файла.
Цена среды 0 рублей и 0 копеек. :)

0

21

1. цена компилятора? он же не бесплатный. А что видел бесплатного - не, поиграться, но заплачу за хорошее.

2. объясните мне, тупому: что можно оптимизировать?
я написал код - так и должно быть!
а то я поставил (условный пример) цикл 10000 раз ради некой паузы, а оптимизатор увидел ,что пустое действо и удалил.
что за бред-то?...

0

22

Александр Д. написал(а):

цена компилятора?

https://ru.wikipedia.org/wiki/GNU_Compiler_Collection

Александр Д. написал(а):

он же не бесплатный.

Бесплатный. :)

Александр Д. написал(а):

я написал код - так и должно быть!

Компилятор оптимизирует в т. ч. с учетом архитектуры процессора. Не факт что то что вы написали будет эффективно работать. Оптимизатор корректирует код для лучшей производительности. Современные компиляторы (подразумеваю GCC о котором сейчас речь) как правило генерируют лучший код чем смогли бы написать на ассемблере. Конечно при включенной оптимизации.

Александр Д. написал(а):

а то я поставил (условный пример) цикл 10000 раз ради некой паузы, а оптимизатор увидел ,что пустое действо и удалил.

Если оптимизатору не запретить это делать то удалит и будет прав. У него работа такая - удалить все что ненужно и оптимизировать все что нужно.

Александр Д. написал(а):

что за бред-то?

Это не бред, а оптимизация программы. Она дает не только прирост скорости выполнения, но и уменьшает размер кода. :)

0

23

про GNU знаю со времён Линуксов..
он мне не в кайф. Причины - озвучены.

про оптимизацию: я хочу иметь то, что я написал.
Если корявый программист - то никакая мега-оптимизация не поможет! индусский код он такой
(старческим голосом): а вот раньше Скайп на П1 запускал и по диалапу с Америкой общался. Сейчас 4 Гб памяти, сколько-то там ГГц проц (сколько ядер не знаю), интернет - 60/120 мБит/с и общаясь с шефом, у которого 1 Ггбит - дикие тормоза и пропадания (не всегда, но 2 раза в неделю точно).

0

24

Александр Д. написал(а):

Причины - озвучены.

Если вы про это

Александр Д. написал(а):

Или цена безбожная, или какчество - сделай сам, ты же линуксоид!

То ничего подобного нет (по крайней мере у меня). С компилятором вообще дела не имею. Моя задача создать проект в IDE, написать код и выполнить компиляцию (один клик по кнопке), дальше все делает IDE, т. е. взаимодействует с компилятором, линкером и т. д. Компиляция не сложнее чем в баскоме.
С отладкой аналогично. Я запускаю отладку (один клик по кнопке), а что делает IDE для ее запуска и работы, только догадываюсь. Все намного проще чем кажется.

Александр Д. написал(а):

про оптимизацию: я хочу иметь то, что я написал.

Оптимизацию можно выключить, но это скажется на размере прошивки. К примеру в одном из проектов который сейчас разрабатываю, при оптимизации -O2 размер прошивки около 14 КБ, а если ее отключить (-O0) размер будет 27 КБ. Хотя это не критично. В МК 128 КБ флеша и его в любом случае хватит.
На самом деле "подружится" с оптимизатором не сложно. Достаточно переменные объявлять со спецификатором volatile и компилятор связанный с ними код оптимизировать не будет. Конечно так объявлять необходимо не все переменные, а только те что нужно.

0

25

Идрис Шах написал(а):

Согласно одному западному мудрецу, критике следует пройти такие стадии:
1. Это невозможно.
2. Это возможно, но бесполезно.
3. Это полезно и я всегда знал об этом.
Затем критика может прекратиться....

Каждый из нас находится на своей ступени развития.
Четко вижу, что персонально я нахожусь в положении пункта №2.  :D

+1

26

pavel1969 написал(а):

Четко вижу, что персонально я нахожусь в положении пункта №2.

Вы про Си или про STM32?
В последнем случае нужно лучше узнать возможности МК и тогда из бесполезных они станут полезными. :)
Например в таймерах STM32 есть возможность ШИМ захвата. http://we.easyelectronics.ru/STM32/ir-u … ast-1.html
В AVR есть обычный захват, но несколько мне известно ШИМ захвата нет.
Контроллер вложенных прерываний тоже заслуживает внимания. В ATmega или ATtiny одно прерывание не может прервать другое, хотя иногда бывает такая необходимость. В STM32 каждому прерыванию можно назначить приоритет и более приоритетные смогут прервать менее приоритетные.
DMA вообще вещь! В цветомузыке производится оцифровка звука 20 тысяч раз в секунду. На ATmega пришлось бы настроить прерывание по окончанию преобразования АЦП. Но 20 тысяч прерываний в секунду это мягко говоря не мало и прилично "съест" процессорного времени, которого может не захватить на другие "цветомузыкальные" вычисления. В STM32 сделано проще - вместо 20 тысяч прерываний, происходит всего 20 благодаря DMA. Вообще все что касается сбора семплов сделано аппаратно. Таймер 20 тысяч раз в секунду "пинает" АЦП, АЦП по окончанию преобразования "пинает" DMA, а тот по заполнению массива (для цветомузыки выбран размер 1024 uint16_t элементов) генерирует прерывание. Процессору остается лишь забрать данные и произвести вычисления. А в это время аппаратно готовятся новые данные. :)

Другими словами, МК STM32 стоят того чтобы их изучить и использовать. :)

+1

27

Пётр написал(а):

Вы про Си или про STM32?

Да я взагали, в смысле - вообще...  :)
Необходимость новых знаний - это вопрос стимулов и мотиваций. Насколько они сильны. И насколько конечный продукт деятельности востребован?
Человек такая, ограниченная и отграниченная, штука.... Человек не может знать ВСЁ.
В конечном итоге рано или поздно любой из нас упрется в свои пределы.

0

28

у меня всё просто и медленно...
DMA знаю по программированию 286х, приоритеты прерывания вроде тоже где-то задавал...
пока для себя задач не вижу.
Да, дико интересно, но оглядываюсь по комнате: этот проект два года полумертвы лежит, этот делаю, это делаю тоже, это для души (забыл когда им занимался), а это еще года два на это место положил с мыслью: яка знатна хреновина, надо её задействовать :)
плюс текущая работа...
ну и остаётся: да ну их, их же с нуля учить надо! а работы не початый край...
чисто человеческий фактор
да и в цене моих проектов 500р - даже не заметны...

0

29

Продолжение курсов то будет?

Установам EmBitz, STM32 есть и программатор к ней. ЖДУ!

0

30

-NMi- написал(а):

Продолжение курсов то будет?

Пётр написал(а):

Рассказывать все о языке слишком долго. Кому интересно можете прочитать какую-то книжку для "чайников" начинающих, например эту (читать до 139 страницы) http://rgho.st/private/6r8Bb9mdP/c94003 … 045ca42438

Расказывать обо всех нюансах слишком долго и требует много времени (можно книгу написать с несколькими сотнями страниц). Это все равно что в мелочах рассказывать о баскоме или о подробном устройстве AVR.
Эта тема создана скорее для вопросов по языку Си.

Практическая часть по освоению STM32 уже есть (Пример) Простая программа - "мигалка" светодиодом
Отладка программы
Прерывания
И остальные темы в разделе.

Не стоит сильно увлекаться использованием STM32CubeMX. По началу кажется что задача упрощается (так оно и есть), но в дальнейшем лучше отказаться от Куба и использовать библиотеку SPL.

+2