MIPI_BaseC_WebinarFRTK/26_Seminar13/27_Microcontrollers/3_3_ihex.c

51 lines
3.0 KiB
C
Raw Normal View History

2024-11-14 08:39:22 +03:00
//~ 3. Пример: ihex.c.
//~ Написать функцию print_array_similarly_to_intel_hex(void* addr, int len) (название условное, естественно),
//~ выводящую на экран массив в следующем текстовом формате (все числа выводятся шестнадцатеричными числами в верхнем регистре, по два символа на байт):
//~ 1. Первая строка: двоеточие, затем все байты адреса, кроме двух младших;
//~ 2. Каждая следующая строка содержит данные, разложенные по полям:
//~ 1. Двоеточие (`':'`)
//~ 2. Первое поле — два байта (младшие два байта тех данных,
//~ которые выводятсяв данной строке — для первой строки данных это будут просто два младших байта переменной `addr`,
//~ для каждой следующей строки прибавляем к предыдущему адресу число байтов данных, записанных в предыдущей строке).
//~ 3. Второе поле — число 00
//~ 4. Третье поле — данные (не более 16 байтов, подряд)
//~ 5. Четвёртое поле — один байт, считающийся как сумма всех предыдущих байтов в строке (с переполнением, разумеется).
#include <stdio.h>
#include <stdint.h>
uint32_t array[100];
void print_array_similar_to_intel_hex(void* addr, int len)
{
int i=0;
uint8_t checksum = 0;
printf(":%04X\n", ((uint64_t)addr >> 16) &0xFFFF );
for( i = 0; i < len; ) // Здесь я не инкрементирую i, так как удобнее делать проверку внутри тела, но после инкрементирования
{
if( i % 16 == 0) // т.к. пишем не более 16 байтов на строку по условию, i%16 - признак начала строки
{
printf( ":%04X00", (uint64_t)addr & 0xFFFF );
checksum = ((uint64_t)addr & 0xFF) + ( ((uint64_t)addr >> 8) & 0xFF);
}
printf("%02X", *(uint8_t*)addr);
checksum += *(uint8_t*)addr;
addr++;
i++; /// А вот тут увеличиваем i и смотрим, не закончилась ли строка
if( i % 16 == 0 || i == len) // т.к. пишем не более 16 байтов на строку по условию, i%16 - признак конца строки, либо - если завершили всю записб
{
printf( "%02X\n", checksum );
}
}
}
int main()
{
array[0] = 0x12345678;
array[1] = 0xABCDEF12;
print_array_similar_to_intel_hex(array, 100);
return 0;
}