Приведение указателя на структуру к указателю на массив char - C (СИ)
Формулировка задачи:
Доброго всем дня! Работаю с микроконтроллерами, возникла необходимость записывать структуру с начальными установками во флеш память МК.
Структура выглядит так: - это переменная типа settings, структура.
Функция записи во flash (фрагмент):
Компилятор, естественно, ругается на несоответствие типов в строке, выделенной красным.
Вопрос. Как привести указатель на структуру к указателю на unsigned char? Возможно ли это? Заранее спасибо.
typedef struct _settings { ADC_const zero; //16 ADC_const span; //16 DWORD capacity; //4 DWORD offset; //4 float calbration_const; //4 BYTE discrete; //1 BYTE stability_factor; //1 BYTE zero_factor; //1 BYTE autozero_factor; //1 BYTE frequency; //1 }settings; //49 bytes extern settings cal;
void write_to_flash (settings *data) { unsigned char counter=0; while (counter<64) { TABLAT=*data; TABLAT //- служебный регистр МК, тип unsigned char _asm TBLWTPOSTINC // write to holding register and post-increment TBLPTR _endasm COUNTER++; *data++; } }
Красным не получилось, выделить, строка 4. TABLAT=*data
Решение задачи: «Приведение указателя на структуру к указателю на массив char»
textual
Листинг программы
void write_to_flash (settings *data) { unsigned char counter=0; unsigned char *tmpData=(unsigned char *) data; for(int i=0;i<64;i++) { TABLAT=tmpData[i]; _asm TBLWTPOSTINC // write to holding register and post-increment TBLPTR _endasm } }
Объяснение кода листинга программы
- Объявлена функция
write_to_flash
, которая принимает указатель на структуруsettings
в качестве аргумента. - Внутри функции объявлена переменная
counter
типаunsigned char
и инициализирована значением 0. - Также внутри функции объявлен указатель
tmpData
типаunsigned char *
, который будет использоваться для доступа к данным структурыsettings
. УказательtmpData
инициализирован значениемdata
. - Далее следует цикл
for
, который выполняется 64 раза. - Внутри цикла каждая ячейка массива
tmpData
(которая является указателем на структуруsettings
) присваивается значениюTABLAT
. - Затем выполняется ассемблерный блок кода, который записывает данные в регистр и инкрементирует указатель на следующий элемент массива.
- После выполнения ассемблерного блока кода цикл продолжается до тех пор, пока все 64 элемента массива не будут обработаны.
- Функция завершается, и управление возвращается вызывающей программе.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д