Лабораторная 3
.docxМинистерство науки и высшего образования Российской Федерации
Федеральное государственное автономное образовательное учреждение высшего образования
ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОННИКИ (ТУСУР)
Кафедра комплексной информационной безопасности электронно-вычислительных систем (КИБЭВС)
ОСНОВЫ СБОРКИ ПРОЕКТА
Отчет по лабораторной работе №3
по дисциплине «Основы программирования микроконтроллеров»
Студенты гр. 712-2: ___________ Л.С. Болтушкин
___________ Н.А. Рыбин
___________ Д.В. Шабанова __________
Руководитель Старший преподаватель кафедры КИБЭВС
_______ __________ Д.С. Беляков
__________
Томск 2025
Введение
Целью данной лабораторной работы является углубленное изучение архитектуры ARM на примере микроконтроллера STM32F103RBT6, знакомство с основами сборки проекта под ядро Cortex-M3, исследование и модификация содержимого startupи ld-файлов, разработка make-скрипта для автоматической генерации файла прошивки.
1 ХОД РАБОТЫ
На рисунке 1.1 представлены все файлы, которые были использованы в процессе выполнения лабораторной работы.
Рисунок 1.1 – Файлы архива
Листинг файла «stm_f103.ld» представлен в Приложении А.
Далее был написан код на «С» по варианту №5 - Функция operate() выводит разницу между первым и последним числом массива. Результаты работы программы представлен на рисунке 1.2.
Листинг кода представлен в Приложении Б.
Рисунок 1.2 – Результат работы программы
На рисунке 1.3 представлен Makefile.
Рисунок 1.3 – Makefile
На рисунке 1.4 представлено сравнение итоговой сборки с разным ld-файлами.
Рисунок 1.4 – Сравнение итоговых сборок
Заключение
В ходе выполнения данной лабораторной работы было проведено углубленное изучение архитектуры ARM на примере микроконтроллера STM32F103RBT6, знакомство с основами сборки проекта под ядро Cortex-M3, исследование и модификация содержимого startup- и ld-файлов, разработка make-скрипта для автоматической генерации файла прошивки.
Приложение А
(обязательное)
Листинг файла «stm_f103.ld»
ENTRY(Reset_Handler)
_estack = 0x20004FFF; /* STM32F103RB имеет 20 КБ RAM */
_Min_Heap_Size = 0x200;
_Min_Stack_Size = 0x400;
MEMORY
{
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 128K
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 20K
}
SECTIONS
{
.isr_vector :
{
. = ALIGN(4);
KEEP(*(.isr_vector))
. = ALIGN(4);
} >FLASH
.text :
{
. = ALIGN(4);
*(.text)
*(.text*)
KEEP(*(.init))
KEEP(*(.fini))
. = ALIGN(4);
_etext = .;
/* <<< отступ ровно 100 байт после кода >>> */
. = . + 100;
} >FLASH
/* конец .text + 100 байт пустоты */
.rodata :
{
. = ALIGN(4);
*(.rodata)
*(.rodata*)
. = ALIGN(4);
} >FLASH
_sidata = LOADADDR(.data);
.data :
{
. = ALIGN(4);
_sdata = .;
*(.data)
*(.data*)
. = ALIGN(4);
_edata = .;
} >RAM AT>FLASH
.bss :
{
. = ALIGN(4);
_sbss = .;
bss_start = _sbss;
*(.bss)
*(.bss*)
*(COMMON)
. = ALIGN(4);
_ebss = .;
bss_end = _ebss;
} >RAM
._user_heap_stack :
{
. = ALIGN(8);
PROVIDE(end = .);
PROVIDE(_end = .);
. = . + _Min_Heap_Size;
. = . + _Min_Stack_Size;
. = ALIGN(8);
} >RAM
/DISCARD/ :
{
libc.a ( * )
libm.a ( * )
libgcc.a ( * )
}
}
Приложение Б
(обязательное)
Листинг файла «lab3_f103.c»
#include <stddef.h>
#include <stdio.h>
void operate(int* buff_in, size_t len_in)
{
// Проверка входных данных
if (!buff_in) {
fprintf(stderr, "Ошибка: входной массив равно NULL\n");
return;
}
int first = buff_in[0];
int last = buff_in[len_in-1];
int res = first-last;
printf(": ");
printf("%d", res);
}
