MIPI_BaseC_WebinarFRTK/26_Seminar13/27_Microcontrollers/3_3_ihex.c
2024-11-14 08:39:22 +03:00

51 lines
3.0 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//~ 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;
}