51 lines
3.0 KiB
C
51 lines
3.0 KiB
C
//~ 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;
|
||
}
|