Приведение указателя на структуру к указателю на массив 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 элемента массива не будут обработаны.
- Функция завершается, и управление возвращается вызывающей программе.