Функция printf MSP430 выполняется слишком медленно [закрыто]

Я пытаюсь использовать 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 в целом могли бы дать некоторые предложения.

Я не вижу '?' в вашем посте.
Вы можете обнаружить, что он отправляет байт за раз; попробуйте snprintf в буфер, а затем распечатайте буфер.
Встроенные функции printf и т. д. часто могут быть довольно медленными, поскольку они универсальны и не всегда наиболее эффективны для текущей работы. Взгляните на источник и посмотрите, сможете ли вы сделать более быструю и конкретную рутину.
Это место зарезервировано для вопросов. Это не сайт шоу и рассказов.

Ответы (1)

Во-первых, вы используете последовательный порт USB CDC или UART, питающий преобразователь UART-> USB? Если последнее, ваша скорость передачи данных может быть слишком низкой.

Вы можете оптимизировать вывод шестнадцатеричных значений, предположив, что всегда хотите печатать 4 символа. Тогда это простой случай генерации символа для каждого кусочка. Таблица поиска, вероятно, будет самым быстрым вариантом.

Я думаю, что это последний случай. Тем не менее, я смотрю исходный код, где определена скорость передачи данных, 115200 — это максимально возможная скорость. Я попытался увеличить до 230400, но произошла ошибка.