kincajou: (Default)
[personal profile] kincajou
Дано:
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[] с размером, точно заранее неизвестным (но можно прикинуть максимальную величину).

Это вообще КАК?! Каким образом вызов, осуществляемый сильно после, может влиять на вызов задолго до? Я бы ещё понял, если бы какая-то многопоточность-параллельность была, но это же строго однопоточная программа без ничего!
This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

December 2016

S M T W T F S
    123
45678910
11121314151617
18192021222324
25 262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 28th, 2025 04:51 am
Powered by Dreamwidth Studios