kincajou: (Default)
Перестало получаться даже самое элементарное. Что глючит? или это я окончательно сошёл с ума?
Дано: в буфере buffer лежит строка ASCII, содержащая три целых числа (в виде их записи), то есть, например, 6 -236 0
Скармливаю её sscanf (buffer, "%lu %d %d", &n, &I, &Q);
На выходе получаю, что n, I и Q равны соответственно 6, 0 и 0.
Скармливаю другую строчку: 7 0 -251.
Получаю 7, -1 и -251

Такое ощущение, что вот именно второе число считываться упорно не хочет. Что это? Как это?! Всегда работало и вдруг такое...

Мало того, поведение программы ещё и зависит от того, с какими флагами оптимизации её скомпилить! Например, если оптимизацию отключить совсем, тогда ещё и первое число не воспринимается - читается либо 0, либо 65535. Бред какой-то.
kincajou: (Default)
Дано:
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[] с размером, точно заранее неизвестным (но можно прикинуть максимальную величину).

Это вообще КАК?! Каким образом вызов, осуществляемый сильно после, может влиять на вызов задолго до? Я бы ещё понял, если бы какая-то многопоточность-параллельность была, но это же строго однопоточная программа без ничего!

December 2016

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

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 12th, 2025 08:30 am
Powered by Dreamwidth Studios