Я пытаюсь использовать Sky mote (MSP430 F1611 + CC2420) для чтения данных с датчика I2C с частотой дискретизации 100 Гц и записи данных в последовательный порт (USB). Я попробовал пару тестов и понял, что суммарные выходные данные имеют частоту дискретизации 78 Гц. Я использовал rtimer для профилирования моего кода выборки и печати и обнаружил, что функция печати замедляет весь процесс. Вот некоторые результаты профилирования:
start 50628
15490,f074,20,3b8c,ffab,49,ffcf,fb70
end 51189
start 51293
15491,f0a8,fff4,3ba4,ffc6,24,ffd8,fb90
end 51880
start 51984
15492,f094,20,3b30,ffa7,5b,fff3,fb70
end 52544
start 52647
15493,f118,bc,3ce0,ffab,70,fffc,fb90
end 53207
start 53311
15494,f030,1b0,3b44,ffa9,1f7,1f,fb80
end 53871
Rtimer имеет 4098*8 тиков в секунду. Здесь мы ясно видим, что печать занимает около 560 тиков (17 мс). Если частота дискретизации составляет 100 Гц, функция печати должна быть завершена в течение 10 мс (327 тактов).
Встроенная система, которую я использую, - это ОС Contiki, а скорость передачи данных составляет 115200 (максимальная скорость передачи данных). Образец датчика содержит 112-битное целое число со знаком.
Вот мой код:
mpu_data_union samples;
int m=mpu_sample_all(&samples);
printf("start %u\n",RTIMER_NOW());
printf("%lu,%x,%x,%x,%x,%x,%x,%x\n",
counterxx,samples.data.accel_x,samples.data.accel_y,
samples.data.accel_z,samples.data.gyro_x,
samples.data.gyro_y,samples.data.gyro_z,
samples.data.temperature);
printf("end %u\n",RTIMER_NOW());
Я надеюсь, что некоторые люди с предыдущим опытом оптимизации printf или UART в целом могли бы дать некоторые предложения.
Во-первых, вы используете последовательный порт USB CDC или UART, питающий преобразователь UART-> USB? Если последнее, ваша скорость передачи данных может быть слишком низкой.
Вы можете оптимизировать вывод шестнадцатеричных значений, предположив, что всегда хотите печатать 4 символа. Тогда это простой случай генерации символа для каждого кусочка. Таблица поиска, вероятно, будет самым быстрым вариантом.
нидин
pjc50
Джон Ю
Олин Латроп