Процессор STM32F051. Среда IAR.
Преамбула.
Я написал драйвер TFT экрана и использую FreeRTOS 7.3
Для того, чтобы отделить задачу драйвера от других задач, использую очередь.
В очереди передаю указатель на буфер данных для дисплея.
Когда передавал только текст, было всё хорошо. Но понадобилось передавать команды управления.
Задумка простая: первый байт - длина данных или текста (int8_t) - знаковое число, потом сама команда. Если длина данных положительная, то это текстовая строка. Если отрицательная - это команда. Команды бывают с параметрами, например установка позиции курсора. Для простого доступа к отдельным полям я определил структуры управления:
Код: Выделить всё
typedef struct // структура указателей на буфер для передачи через очередь
{
uint16_t size; // размер данных
uint8_t *buffer; // указатель на буфер
} IO_BUF;
typedef struct
{
int8_t len;
TFT_COMAND command;
uint16_t x;
uint16_t y;
} TFT_S_CURSOR;Код: Выделить всё
TFT_S_CURSOR *p_cursor = (TFT_S_CURSOR *)&g.TFT_out.buffer[index];
p_cursor->len = -(int8_t)sizeof(TFT_S_CURSOR);
p_cursor->command = C_CURSOR;
p_cursor->x = 10U;
p_cursor->y = 20U;
index += sizeof(TFT_S_CURSOR);а index - смещение от начала буфера, так как в одном буфере могут передаваться несколько команд.
Сама структура g выровненная по полю 4 байта.
команда command типа enum, то есть размера char
В момент присвоения p_cursor->x = 10; возникает hard fault error
Вопрос: сталкивался ли кто с такой проблемой?
Как вы передаёте команды и текст, используя очередь?
Как лучше решить такую задачу?


