Приведение указателя на структуру к указателю на массив char - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Доброго всем дня! Работаю с микроконтроллерами, возникла необходимость записывать структуру с начальными установками во флеш память МК. Структура выглядит так:
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;
- это переменная типа settings, структура. Функция записи во flash (фрагмент):
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++;
   }
}
Компилятор, естественно, ругается на несоответствие типов в строке, выделенной красным. Вопрос. Как привести указатель на структуру к указателю на unsigned char? Возможно ли это? Заранее спасибо.
Красным не получилось, выделить, строка 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 
   }
}

Объяснение кода листинга программы

  1. Объявлена функция write_to_flash, которая принимает указатель на структуру settings в качестве аргумента.
  2. Внутри функции объявлена переменная counter типа unsigned char и инициализирована значением 0.
  3. Также внутри функции объявлен указатель tmpData типа unsigned char *, который будет использоваться для доступа к данным структуры settings. Указатель tmpData инициализирован значением data.
  4. Далее следует цикл for, который выполняется 64 раза.
  5. Внутри цикла каждая ячейка массива tmpData (которая является указателем на структуру settings) присваивается значению TABLAT.
  6. Затем выполняется ассемблерный блок кода, который записывает данные в регистр и инкрементирует указатель на следующий элемент массива.
  7. После выполнения ассемблерного блока кода цикл продолжается до тех пор, пока все 64 элемента массива не будут обработаны.
  8. Функция завершается, и управление возвращается вызывающей программе.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.857 из 5
Похожие ответы