Хотя я предполагаю, что для изучения языка Си вы воспользуетесь материалами, доступными в интернете, я хочу обозначить основные элементы языка, которые часто используются при программировании для МК вообще, и STM8 в частности.
1. Основной файл программы называется main.c
Это необязательно, но так принято. В нем определяется функция main(), которая является точкой входа программы на языке Си.
void main()
{
/* это классический комментарий в программе на Си */
// такие комментарии в Си обычно тоже работают
}
2. В начале файла подключаются необходимые заголовочные файлы
Мы будем пользоваться библиотекой для работы с периферийными устройствами STM8S STM8S/A Standard peripheral library (STSW-STM8069)
Чтобы ей воспользоваться вставляем в начале main.c строчку
#include "stm8s.h"
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)
Комментариев нет:
Отправить комментарий