Таинственное
Dec. 5th, 2011 09:33 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Дано:
1) микроконтроллер AT90CAN128
2) компилятор AVR GCC какой-то там из свежих.
3) код, выглядящий примерно так:
Всё прекрасно работает, причём уже давно и в разных устройствах.
Настал момент, когда пришлось взять старый дивайс (даже два) и заставить их делать то, к чему они не предполагались. Но, в общем, всё то же самое по сути. Теперь код выглядит так:
Так вот, из-за добавления вызова функции, передающей по CAN значение интересующей меня переменной, (внимание!) вызов
то всё работает (разумеется, из-за этого приходится создавать массив variable[] с размером, точно заранее неизвестным (но можно прикинуть максимальную величину).
Это вообще КАК?! Каким образом вызов, осуществляемый сильно после, может влиять на вызов задолго до? Я бы ещё понял, если бы какая-то многопоточность-параллельность была, но это же строго однопоточная программа без ничего!
1) микроконтроллер AT90CAN128
2) компилятор AVR GCC какой-то там из свежих.
3) код, выглядящий примерно так:
for (pid = pid.first; !pid.last; pid = pid.next) { variable = get_some_data_from_peripheral(&pid); console_report(variable); }
Всё прекрасно работает, причём уже давно и в разных устройствах.
Настал момент, когда пришлось взять старый дивайс (даже два) и заставить их делать то, к чему они не предполагались. Но, в общем, всё то же самое по сути. Теперь код выглядит так:
for (pid = pid.first; !pid.last; pid = pid.next) { variable = get_some_data_from_peripheral(&pid); console_report(variable); CAN_transmit(TAG, variable); }
Так вот, из-за добавления вызова функции, передающей по CAN значение интересующей меня переменной, (внимание!) вызов
variable = get_some_data_from_peripheral(&pid);
перестаёт возвращать корректные величины и начинает возвращать ахинею. И это не какой-нибудь там срыв стека - памяти ещё навалом, почти полтора килобайта. Мало того, если я делаю костыль типа:for (pid = pid.first, id=0; !pid.last; pid = pid.next) { variable[id] = get_some_data_from_peripheral(&pid); console_report(variable[id]); last_id = ++id; } /* bla-bla-bla */ for (id = 0; id != last_id; id++) { CAN_transmit(TAG, variable); }
то всё работает (разумеется, из-за этого приходится создавать массив variable[] с размером, точно заранее неизвестным (но можно прикинуть максимальную величину).
Это вообще КАК?! Каким образом вызов, осуществляемый сильно после, может влиять на вызов задолго до? Я бы ещё понял, если бы какая-то многопоточность-параллельность была, но это же строго однопоточная программа без ничего!