Содержание
- 2. Микроконтроллер Микросхема, содержащая в себе функционально законченный компьютер – с ядром (процессором), памятью и периферийными устройствами.
- 3. Для обработки информации и принятия решений, необходимо: Превратить входную информацию в данные, пригодные для хранения в
- 4. Программа Алгоритм Типы и структуры данных Интерфейс с внешним миром
- 5. Элементы алгоритмов Следование. Последовательность действий, выполняющихся друг за другом. Условие. Точка принятия решения, после которой выполнение
- 6. Числа Двоичная система используется для хранения чисел в памяти компьютера, для их обработки в процессоре и,
- 7. Числа Размер ячеек памяти как правило кратен восьми двоичным разрядам (восьми битам): Зачастую удобнее использовать шестнадцатеричную
- 8. Взаимодействие вычислительной системы с внешним миром Устройства ввода: Кнопки, клавиши, переключатели, энкодеры; Датчики; Источники потоковых данных
- 9. Взаимодействие вычислительной системы с внешним миром Все внешние устройства, как правило, представлены для ядра в виде
- 10. Параллельный вывод Память Ячейка (регистр) PORT_DATA Выводы микросхемы микроконтроллера Ядро D0 D7 Запись числа в ячейку
- 11. Параллельный ввод Память Ячейка (регистр) PORT_DATA Выводы микросхемы микроконтроллера Ядро D0 D7 Чтение числа из ячейки
- 12. Последовательный ввод/вывод Память Регистр данных SERIAL_DATA Сдвиговый регистр Ядро RX Опрос готовности Регистр состояния SERIAL_STATE Чтение/запись
- 13. Потоковый вывод Память Массив видеопамяти Дисплей Ядро
- 14. Язык Си Программа на языке Си представляет собой набор текстовых файлов (в простейшем случае – один
- 15. Переменные Переменная – это область в памяти компьютера, которая имеет имя и хранит некоторое значение. Значение
- 16. Объявление переменных Объявление переменной – это описание переменной, которая в дальнейшем будет использоваться в программе. Переменная
- 17. Объявление переменной Синтаксис оператора объявления: имя_типа имя_переменной; Тип переменной определяет, какие данные в ней хранятся В
- 18. Типы переменных Тип переменной (и вообще тип любых данных) – указание компилятору на то, сколько памяти
- 19. Типы скалярных переменных Слова «unsigned» / «signed» можно не указывать, однако в этом случае результирующий тип
- 20. Функция получения размера переменной В языке Си есть специальная встроенная функция sizeof(), которая может посчитать размер
- 21. Константы Запись чисел (числовых констант) в Си: 255 // десятичное число 0xFF // шестнадцатеричное число ’x’
- 22. Оператор присваивания Присваивание – это запись значения в переменную Result = 1; Average = (a +
- 23. Переменные – регистры управления Все периферийные устройства микроконтроллера управляются при помощи набора регистров, находящихся в общем
- 24. Переменные – регистры управления Например, в микроконтроллере LPC2368 состояние порта ввода-вывода управляется регистрами FIOnPIN, где n
- 25. Выражения в языке C Везде, где согласно правилу написания того или иного оператора требуется присутствие того
- 26. Арифметические операции
- 27. Сложные типы данных Сложные типы состоят из нескольких простых (скалярных) типов. Сложные типы в Си –
- 28. Массивы Массив или вектор – переменная, хранящая ряд значений одного типа t0, t1, t2, …, tN
- 29. Массивы Массив объявляется так же, как и простая (скалярная) переменная, однако после имени в квадратных скобках
- 30. Работа с элементами массивов Для доступа к элементу массива в квадратных скобках после имени указывают номер
- 31. Работа с элементами массивов Для того, чтобы посчитать количество элементов массива, можно воспользоваться функцией sizeof(), разделив
- 32. Строки символов Строка символов в языке Си считается массивом из 8-разрядных чисел (значений типа char). [На
- 33. Строковые функции
- 34. Строки символов Так как в конце строки стоит признак конца строки (символ с кодом 0), то
- 35. Структуры Язык Си позволяет объединять переменные разных типов в структуры: struct Point { signed short x;
- 36. Структуры Для объявления переменной типа структуры пишут ключевое слово struct, затем имя структуры, а затем имя
- 37. Расположение структур в памяти Элементы структуры хранятся последовательно, друг за другом, но с учетом выравнивания по
- 38. Структуры с битовыми полями Для доступа к отдельным битам и просто для экономии памяти можно указать
- 39. Объединения Объединения – это способ описать одну и ту же область памяти по разному. Объединение занимает
- 40. Объединения Объединения удобно использовать для работы с пакетами данных. struct Message_str { unsigned char Header unsigned
- 41. Операции доступа к данным
- 42. Указатели Указатели – это переменные, хранящие адреса других переменных (то есть адреса ячеек в памяти).
- 43. Указатели Указатель – это переменная, которая хранит адрес ячейки памяти. Память 10 0000 1256 char a
- 44. Объявление переменных-указателей При объявлении обычно задают тип данных, на которые будет указывать переменная: имя_типа* имя_переменной; Например:
- 45. Операции с указателями Для доступа к содержимому ячейки, на которую указывает указатель, перед именем переменной-указателя пишут
- 46. Операции с указателями Для доступа к полю структуры, на которую указывает указатель, между именем переменной-указателя именем
- 47. Операции с указателями Указатели используют для работы с массивами и буферами. // поиск максимального числа в
- 48. Операции с указателями После имени переменной-указателя можно поставить квадратные скобки с индексом и работать с указателем
- 49. Указатель на физическую ячейку Можно объявить указатель, указывающий на ячейку с заданным адресом. Делается это при
- 50. Указатель на неопределённый тип В ряде случаев бывает нужна переменная, которая просто хранит адрес ячейки, без
- 51. Функции работы с памятью Библиотека string.h, помимо функций работы со строками, содержит средства для работы с
- 52. Управление битами При управлении внешними устройствами, входящими в состав микроконтроллеров, часто встает задача управления отдельными битами
- 53. Битовые операции
- 55. Блоки операторов в Си Это способ описания действий
- 56. Блок операторов Операторы могут быть сгруппированы в блоки или составные операторы: { (последовательность операторов) } Блок
- 57. Функции Функция – основная единица программы в языке Си. В функциях описываются действия, которые должна выполнять
- 58. Функции Функция определяется следующим образом: тип_функции имя_функции (список_параметров) { тело_функции } Имя типа, стоящее перед именем
- 59. Функции Функция может получать параметры и возвращать значения: double GetAverage(double a, double b) { double result
- 60. Функции Если функция не возвращает ничего, вместо типа пишут «void»: void BlinkLED (unsigned char period) {
- 61. Объявление переменных и область видимости Язык Си позволяет объявлять переменные в любом месте файла с исходным
- 62. Непосредственно перед компиляцией текст программы обрабатывается специальным текстовым процессором – т.н. «препроцессором». Препроцессор
- 63. Препроцессор Непосредственно перед компиляцией текст программы обрабатывается специальным текстовым процессором – «препроцессором». Любая строка, начинающееся с
- 64. Препроцессор Типичный пример использования макросов (макроподстановок) – замена константы на символическое имя: #define PI 3.14 Если
- 65. Препроцессор Пример. В программе необходимо в разных местах мигать лампочкой 12 раз. Тогда в начале текста
- 66. Препроцессор #include #include “Project_Def.h” int main() { // текст программы } Команды #include “имя_файла” или #include
- 67. Заголовочные файлы #include “prj_def.h” void flash_lamp() { int i; for (i = 0; i { switch_lamp_on();
- 68. #include “motor.h” void door_mng(void) { switch(door_status) { case OPEN: motor_control(M_MOVE_CCW); break; case CLOSE: motor_control(M_MOVE_CW); break; case
- 69. #include “prj_def.h” char system_state; void main(void) { system_state = SS_START; system_init(); ... if (sensor_ready()) system_state =
- 70. Взаимодействие между модулями (файлами) ПО Обмен данными между разными файлами проекта происходит при помощи: Глобальных переменных
- 71. Взаимодействие между модулями (файлами) ПО static char system_state; void main(void) { ... } char get_system_state(void) {
- 72. Перечисления (перечислимый тип) Используется, если переменная может принимать строго определённый (перечислимый) набор значений.
- 73. Перечисления Язык Си позволяет ограничить набор возможных значений переменной и назвать каждое из них: enum Motor_cmd
- 74. Перечисления Для объявления переменной перечисляемого типа пишут ключевое слово enum, затем имя типа и имя переменной:
- 75. Приёмы программирования встроенных систем При написании ПО для микроконтроллеров используют ряд стандартных решений
- 76. Приемы программирования встроенных систем Нисходящее и восходящее программирование: правильное проектирование набора функций Повсеместное использование машин состояний
- 77. Проектирование набора функций Функции управления в программе могут встречаться в трех разных местах: Функции главного цикла
- 78. Функции главного цикла Функции главного цикла вызываются из главного бесконечного цикла программы. Частота вызова – максимально
- 79. Функции периодических действий Функции периодических действий вызываются либо из прерывания от таймера либо из главного цикла
- 80. Функции обработки событий Функция обработки событий вызываются либо из прерывания от устройства либо из главного цикла
- 81. Проектирование набора функций Кроме функций управления в программе должны присутствовать и иные функции – функции вычислений
- 82. Задачи программирования встроенных систем Управление устройством (объектом) Взаимодействие с пользователем Регулирование Обмен данными: С внешними устройствами
- 83. Машина состояний В основе программирования систем управления лежит прием, называемый программирование машины состояний. Машина состояний –
- 84. Пример задачи с машиной состояний Рассмотрим задачу управления автоматическими дверьми (например, воротами гаража и т.п.) Есть
- 85. Пример задачи с машиной состояний Управление осуществляется с помощью всего одной кнопки, которая открывает закрытую дверь,
- 86. Пример задачи с машиной состояний Построим граф переходов для нашей задачи CLOSED OPENING OPEN CLOSING Нажата
- 87. Пример задачи с машиной состояний while (1) // все происходит { // в бесконечном цикле switch
- 88. Именование состояний Для того, чтобы наш пример с программой управления воротами скомпилировался, необходимо описать все символические
- 89. Именование состояний Описать символические имена можно и с помощью перечислимого типа: // состояния системы enum Gate_State
- 90. Сокращенное объявление сложных типов в Си Чтобы каждый раз не писать «struct» или «enum» при объявлении
- 91. Сокращенное объявление сложных типов в Си // состояния системы typedef enum { CLOSED, OPENING, OPEN, CLOSING
- 92. Переменные-флаги Вырожденным случаем машины состояний является система с двумя состояниями. Переменная, которая описывает такую систему, называется
- 93. Переменные-флаги Пример: модуль интерфейса термостата. Устанавливает флаг «новая температура», когда пользователь заканчивает выбор нового значения температуры.
- 94. Пример с интерфейсом пользователя: управляемый светофор В программе, как правило, присутствуют несколько машин состояний, так как
- 95. Машина состояний светофора GREEN BLINKING_GREEN YELLOW RED ? YELLOW_GREEN Gt секунд 5 секунд 3 секунды Rt
- 96. Машина состояний пульта Помимо основной машины состояний, в нашем устройстве будет еще одна машина, отвечающая за
- 97. Машина состояний пульта MAIN EDIT_GREEN EDIT_RED Кнопка «Время З» 10 секунд после отпускания «⇧» или «⇩»
- 98. Использование переменных-таймеров Для нашего светофора нужно выдерживать (измерять) много разных временных интервалов. «Простой» подход – для
- 99. Использование переменных-таймеров У «простого» подхода два недостатка: Плодятся глобальные переменные, причем модуль таймера должен «знать» о
- 100. Использование переменных-таймеров unsigned int Clock_Counter = 0; void Timer0AIntHandler(void) { TIMER0_ICR_R = TIMER_ICR_TATOCINT; Clock_Counter++; } void
- 101. Задачи взаимодействия устройств Взаимодействие сводится к обмену данными между устройствами при помощи цифровых интерфейсов В результате
- 102. Взаимодействие устройств ПК Устройство Команды Ответы Периферийное оборудование
- 103. Функции коммуникационного ПО Функции приема и передачи данных через интерфейсные устройства Функции разбора принятых пакетов данных
- 104. Функции коммуникационного ПО Функция приема пакета Приемный буфер Функция разбора пакета Основное ПО Функция отправки пакета
- 105. Прием пакета Основная задача – синхронизация между медленными интерфейсами, редкими, асинхронными событиями приёма и быстрым ядром.
- 106. Прием пакета Опрос бита готовности: в каждом устройстве (контроллеры SPI, UART, I2C,...) есть регистр статуса, в
- 107. Прием пакета Прерывание: событие приёма байта вызывает прерывание ядра. Данные читаются из устройства в функции обработки
- 108. Прием пакета #define PACKET_LEN 6 unsigned int rx_counter = PACKET_LEN; unsigned char rx_buffer[PACKET_LEN]; void rx_mng(void) {
- 109. Двойная буферизация Функция приема пакета Приёмный буфер 1 Функция разбора пакета Интерфейс Приёмный буфер 2 Флаг
- 110. Двойная буферизация #define PACKET_LEN 6 unsigned int rx_counter = 0; unsigned char rx_buffer1[PACKET_LEN]; unsigned char rx_buffer2[PACKET_LEN];
- 111. Отправка пакета Основная задача, которая здесь решается – синхронизация быстрого ядра и медленного интерфейса: данные отправляются
- 112. Отправка пакета #define PACKET_LEN 6 unsigned int tx_counter = PACKET_LEN; unsigned char tx_buffer[PACKET_LEN]; void tx_mng(void) {
- 113. Взаимодействие систем
- 114. Взаимодействие систем
- 115. Взаимодействие систем
- 116. Упрощенный стек протоколов В простых системах часть уровней «сливаются» друг с другом.
- 117. Упрощенный стек протоколов Пример:
- 118. Задачи, решаемые на разных уровнях стека Прикладной уровень: Поддержка основной функциональности устройства (команды, ответы на них,
- 119. Задачи, решаемые на разных уровнях стека: прикладной уровень Как правило, программно реализуется при помощи структур и
- 120. Задачи, решаемые на разных уровнях стека: прикладной уровень Как правило, программно реализуется при помощи структур и
- 121. Задачи, решаемые на разных уровнях стека: уровень сессии Уровень сессии как самостоятельная сущность реализуется только если
- 122. Задачи, решаемые на разных уровнях стека: транспортный уровень Синхронизация источника и приемника: В начало пакета добавляется
- 123. Задачи, решаемые на разных уровнях стека: транспортный уровень В итоге транспортный пакет может выглядеть так: Или
- 124. Реализация протокола
- 125. Реализация протокола RX_HEADER RX_ADDR RX_LEN RX_DATA RX_CSUM Правильный заголовок Наш адрес Правильная длина Все данные получены
- 127. Скачать презентацию