Для начала скажу, что прога у меня работает. Но вероятность ошибки низкая и возможно я её просто не вижу. В любом случае хотелось бы получить консультацию и понять что к чему. Пожалуйста не надо писать как это можно сделать по другому. Всё достаточно сложно, и я просто не хочу описывать Вам весь алгоритм работы. Хотябы, чтобы сэкономить Вам Ваше время.
Итак.
Есть данные они непрерывным потоком побайтно поступают в однокристалку. Я размещаю их в куче. При вводе я принимаю их побайтно и формирую из них команды (структуры). Это всё в голове.
В прерывании я обрабатываю уже сформированные структуры и после их обработки - выкидываю из кучи. Важным является то, что выбросить их я могу не только сначала а и из середины. Соответственно в прерывании я убираю образовавшуюся дырку. Но в прерывании я работаю только с сформированными структурами. То есть если очередная структура не полностью загружена, то она ещё не сформирована и не видна в прерывании.
Это вкрадце алгоритм.
Теперь покажу объявления свои
Код
uint8_t static NumbActiveKom=0; // Текущее число активных команд
void static *AdrActiveKom[MAX_ACTIVE_KOM+1]; // Адрес указателей на начало активных команд
.....
uint8_t *TekAdrActive; // Адрес текущей свободной памяти,
void - так как не известно куда указывать. Потом, когда структура сформирована, я делаю примерно следующее.
Код
KomC = (struct AddrKomC*) AdrActiveKom[i]; // Прочитать адрес текущей активной команды
А теперь "внимание вопрос"
Если я при объявлении *TekAdrActive применяю volatile, то возникает ошибка в следующем операторе.
Код
AdrActiveKom[NumbActiveKom+1]=TekAdrActive; //
Цитата
Error[Pe513]: a value of type "uint8_t volatile *" cannot be assigned to an entity of type "void *" D:\work\AVR IAR C\Panno\office.c 1967
В противном случае - всё работает