Ваша общая память должна быть как минимум объявлена как volatile:
volatile xQueueRegistryItem rxQueueStore[MAX_NUMBER_OF_RX_QUEUES] ;
volatile int numberOfQueuesRegistered ;
, иначе компилятор может оптимизировать чтение или запись в них, потому что он не имеет понятия о различных потоках выполнения (между ISR и основнойнить).
Также я напоминаю, что некоторые параметры запуска PIC C не применяют нулевую инициализацию статических данных, чтобы минимизировать время запуска, если вы используете такой запуск, выдолжен явно инициализировать numberOfQueuesRegistered
.Я бы предположил, что это было бы хорошей идеей в любом случае.
Из вашего кода не ясно, что RxMessage
в ISR не совпадает с RxMessage
в «удаленном модуле»;они не должны использоваться совместно, поскольку это позволит ISR потенциально изменять данные, пока их обрабатывает принимающий поток.Если бы они могли быть общими, то не было бы никакой причины иметь очередь во-первых, поскольку общей памяти и семафора было бы достаточно.
В качестве дополнительного примечания никогда не нужно приводить указатель до void*
, и вам, как правило, следует избегать этого, поскольку это не позволит компилятору выдать ошибку, если вы передадите что-то, кроме указателя.Весь смысл void*
в том, что он может принимать любой тип указателя.