четверг, 26 февраля 2015 г.

Программирование на Си для МК (STM8)

Хотя я предполагаю, что для изучения языка Си вы воспользуетесь материалами, доступными в интернете, я хочу обозначить основные элементы языка, которые часто используются при программировании для МК вообще, и STM8 в частности.

1. Основной файл программы называется main.c
Это необязательно, но так принято. В нем определяется функция main(), которая является точкой входа программы на языке Си.
void main()
{
   /* это классический комментарий в программе на Си */
   // такие комментарии в Си обычно тоже работают
}

2. В начале файла подключаются необходимые заголовочные файлы

Мы будем пользоваться библиотекой для работы с периферийными устройствами STM8S STM8S/A Standard peripheral library (STSW-STM8069)

Чтобы ей воспользоваться вставляем в начале main.c строчку
#include "stm8s.h"

Чтобы компилятор нашел этот файл, нужно в свойствах проекта указать путь к папке, в которой он расположен. Также для ясности можно добавить файл к проекту, однако это не избавляет от необходимости указывать путь. Подробнее об этом будет в другой заметке.

3. Для работы с типами данных вместо стандартных для языка Си char, short, int пользуемся синонимами int8_t, int16_t, int32_t, uint8_t, uint16_t, uint32_t или аналогами. Для STM8 эти синонимы определены в файле stm8s.h

Одна из особенностей языка Си в том, что стандартный тип int имеет разное количество бит (и разный диапазон чисел) на разных платформах. На ПК это обычно 32 бита, на МК это могут быть 16 или 8 бит. Поэтому программа, использующая тип int, может работать по-разному на разных платформах. Для улучшения переносимости программы в ней пользуются синонимами с явным указанием разрядности, а сами синонимы определяют в отдельном файле для каждой платформы (часто называется types.h).

int8_t - 8-битное число со знаком, диапазон значений от -128 до +127
int16_t - 16-битное число со знаком, диапазон значений от -32768 до +32767
uint8_t - 8-битное число без знака, диапазон значений от 0 до 255
uint16_t - 16-битное число без знака, диапазон значений от 0 до 65535

32-разрядные числа на 8-разрядном МК используются только при крайней необходимости, поскольку требуют заметно больше тактов МК на каждую операцию.

4. Для работы с регистрами периферийных устройств пользуемся битовыми операциями
a | b    побитовое ИЛИ (OR)
a & b    побитовое И (AND)
a ^ b    исключающее ИЛИ (XOR)
~a       инверсия всех бит

5. Директивой #define даем числовым значениям символьные имена по их смыслу, например:
#define OK          1
#define ERROR       0
#define RESET_MASK  (1<<3)   /* бит 3 */
и далее пользуемся этими именами в программе вместо чисел

6. Условный оператор if

7. Циклы for, while

8. Использование готовых функций и модулей
Стараемся пользоваться существующими наработками - экономим своё время на написание и отладку. Подключаем модуль:
- добавляем файл .с к проекту
- в свой файл вставляем директиву #include "имя_модуля.h"
- вызываем функции модуля function_name(arg1, arg2);

9. Создание своих функций и модулей
Структурируем свою программу. Оформляем отдельные по смыслу блоки программы в виде функций. Повторяющиеся элементы программы также оформляем в виде функции.
Функции, переменные и смысловые имена (#define), решающие одну законченную задачу, оформляем в виде модуля - пары файлов <имя_модуля>.c и <имя_модуля>.h
Чтобы понять, как написать .h файл, смотрите готовые примеры или учебники в интернете.

10. Для объединения переменных, связанных между собой по смыслу, пользуемся структурой (ключевое слово struct)

Комментариев нет:

Отправить комментарий