5.6 KiB
1. Процесс сборки
По сборке (препроцессирование → компиляция → линковка) на удивление вопросов особо нет. Есть один уже на курсе Владмира (STM32),когда нужно к своему проекту подлкючить библиотеку, собранную без поддержки FPU (есть такой прикол у ST), но там так и надо.
2. Битовые операции
Тут все всё знают, но часто не очень понимают. На самом деле полезны будут задачи такого рода:
-
Написать пару функций, одна из которых будет устанавливать все биты, а другая — снимать по маске. Возможное решение: bits.c Простейшая вещь, но довольно полезная (особенно в контексте того, что именно так работает большинство флешек).
-
Прочесть из потока ввода число типа float и затем вывести его на экран в формате a*2^b, где a и b — десятичные числа, причём а в диапазоне от [0,1; 1). Возможное решение: float.c. думал спервадать задачу на полноценный вывод, но сложновато получится на мой взгляд. Пример решения: float.c
-
Реализовать работу с битовым массивом. Ну, то есть функции setbit(uint8_t *array, index, value), int getbit (uint8_t * array, index), тиакие, чтобы устанавливали (забирали) index-й бит по счёту в массиве array. Тоже несложно, но мозг прочистит. Пример, bit_array.c (там немного другие прототипы, т.к. я не понял, как удобнее формулировать задание).
3. Адресная арифметика и указатели
Тоже — все всё знают, а сказать не могут.
-
Пример: address.c. Написать функцию set_value, устанавливающую значение по заданному в виде целого числа адресу.
-
Пример: union.c. Написать typedef для 32-битного типа с названием my_type таким образом, чтобы можно было обращаться к байтам(поле с названием byte), полусловам(u16), словам (u32) и числам с плавающей запятой (f). Ибо это туда же.
-
Пример: ihex.c. Написать функцию print_array_similarly_to_intel_hex(void* addr, int len) (название условное, естественно), выводящую на экран массив в следующем текстовом формате (все числа выводятся шестнадцатеричными числами в верхнем регистре, по два символа на байт):
-
Первая строка: двоеточие, затем все байты адреса, кроме двух младших;
-
Каждая следующая строка содержит данные, разложенные по полям:
-
Двоеточие (
':'
) -
Первое поле — два байта (младшие два байта тех данных, которые выводятсяв данной строке — для первой строки данных это будут просто два младших байта переменной
addr
, для каждой следующей строки прибавляем к предыдущему адресу число байтов данных, записанных в предыдущей строке). -
Второе поле — число 00
-
Третье поле — данные (не более 16 байтов, подряд)
-
Четвёртое поле — один байт, считающийся как сумма всех предыдущих байтов в строке (с переполнением, разумеется).
-
-
4. Работа с текстом
- Это посложнее, но для тренирвоки перед курсовиком… Ну, в идеале: сделать парсер файла (функцию с прототипом
int parse_xpm(char ** xpm, uint16_t *result)
) формата XPM (с одной стороны, PBM проще, с другой — есть две его версии, что не очень удобно в учебных целях). Задача: естьтекстовый файлмассив строк заданного формата с xpm внутри (один символ на точку, два цвета), необходимо найти строку, определяющую чёрный цвет и проанализировать файл, записывая в массив форму кривой — то есть её координату y для каждой координаты x (считаем, что эта зависимость однозначна). Возвращаемое значение функции — ширина изображения. Например, xpm.c