Комментарии 6
не знаю как "убрать под кат" слишком длинные блоки исх текста
Кратко: 4 претензии
1. Конфиг сборки не указан — цифры не воспроизводимы
// эти две сборки различаются в разы, а в статье не сказано, какая:
#define TX_DISABLE_ERROR_CHECKING // 3 вызова × шелл _txe_* минус
#define TX_INLINE_THREAD_RESUME_SUSPEND
#define TX_NOT_INTERRUPTABLE
// vs дефолт (всё выключено) + TX_ENABLE_EVENT_TRACEПлюс грабли: правки в tx_user.h не работают, если библиотека собрана без TX_INCLUDE_USER_DEFINE_FILE.
2. Меряется не то, что в шапке таблицы
TEST1_PRIORITY = 15, TEST2 = 16, в ThreadX 0 — старший ⇒ task1 приоритетнее и не вытесняется:
perf_test_prepare(sid1); // t1
OS_queue_send(...); // task2 ready, НО не вытесняет
OS_evf_get(&TEST1SrvEvf, ...); // ← вот здесь блокировка + switch
// task2: fixCnt() // t2Строка queue = 0.564 = queue_send + evf suspend + switch. Одна и та же добавка сидит во всех четырёх строках. Фикс — сделать получателя старше:
#define TEST1_PRIORITY (PRIO_LVL 16) // отправитель
#define TEST2_PRIORITY (PRIO_LVL 15) // получатель — вытесняет сразу3. embOS мог быть слинкован в debug-режиме
#define OS_LIBMODE_R // release ← так надо
#define OS_LIBMODE_DP // debug+profiling ← дефолт стартпроекта SEGGERОтставание ×2–2.5 и +25…110% инструкций — ровно порядок слоя проверки параметров. Вывод «у ThreadX код лучше» недоказан.
4. Вывод сделан по среднему, а джиттер выброшен
mutex, uni: min 0.458 max 0.583 → разброс 0.13 мкс
mutex, разн. ядра: min 0.750 max 2.083 → разброс 1.33 мкс (×10)Среднее почти вернулось — детерминизм рухнул. Для hard real-time это и есть результат. И 64 прохода на worst case не годятся: нужны десятки тысяч и перцентили, а не min/max.
Мелочи: для мьютекса кросс-ядерно ×3.2, а не заявленные «1.5–2»; SMP-прогон шёл на DRAM 936 против 792 МГц (штраф SMP скорее занижен).
особенно тщательно не анализировал влияние отключения контроля ошибок. на первый взгляд отключение оного дает выигрыш незначительный, до 10% примерно
в данном тесте в обеих ос контроль ошибок не отключался.
вот прогон embos в варианте release (os7t_al_r.a)
Perfomance info threadX CPUclk=0900MHz
service_name min[cyc/inst] max[cyc/inst] min[uS] max[uS] avg[uS] cpi
queue 000998/000488 001976/000488 01.108 02.195 01.236 02.278
Cortex-A7 TRM result 01.125 01.916 01.240
PMU metrics c1=000015 c2=000060
eventFlag 000796/000372 001030/000372 00.884 01.144 00.967 02.338
Cortex-A7 TRM result 00.875 01.166 00.983
PMU metrics c1=000007 c2=000044
semaphore 000615/000332 001255/000332 00.683 01.394 00.696 01.888
Cortex-A7 TRM result 00.708 01.208 00.718
PMU metrics c1=000005 c2=000038
mutex 000703/000328 001838/000328 00.781 02.042 00.817 02.240
Cortex-A7 TRM result 00.791 01.833 00.839
PMU metrics c1=000010 c2=000038 чуть быстрее, но непринципиально
хммм...
#define TEST1_PRIORITY (PRIO_LVL 16) // отправитель
#define TEST2_PRIORITY (PRIO_LVL 15) // получатель — вытесняет сразуто есть я не то меряю? а вероятно может быть
сейчас перемеряю
действительно не то, спасибо!
вот результат когда test1 более приоритетна
embos **_r.a
Perfomance info CPUclk=0900MHz
service_name min[cyc/inst] max[cyc/inst] min[uS] max[uS] avg[uS] cpi
queue 000737/000382 000876/000382 00.818 00.973 00.867 02.044
Cortex-A7 TRM result 00.833 01.000 00.876
PMU metrics c1=000012 c2=000046
eventFlag 000580/000278 000673/000278 00.644 00.747 00.659 02.133
Cortex-A7 TRM result 00.666 00.750 00.683
PMU metrics c1=000009 c2=000035
semaphore 000533/000273 000591/000273 00.592 00.656 00.597 01.967
Cortex-A7 TRM result 00.583 00.666 00.617
PMU metrics c1=000002 c2=000034
mutex 000894/000474 001086/000474 00.993 01.206 01.039 01.972
Cortex-A7 TRM result 01.000 01.250 01.061
PMU metrics c1=000014 c2=000063и threadx
tx_user.h пустой
Perfomance info CPUclk=0900MHz
service_name min[cyc/inst] max[cyc/inst] min[uS] max[uS] avg[uS] cpi
queue 000309/000162 000347/000162 00.343 00.385 00.346 01.919
Cortex-A7 TRM result 00.333 00.375 00.371
PMU metrics c1=000006 c2=000022
eventFlag 000344/000174 000419/000174 00.382 00.465 00.396 02.045
Cortex-A7 TRM result 00.416 00.500 00.418
PMU metrics c1=000005 c2=000021
semaphore 000259/000139 000292/000139 00.287 00.324 00.298 01.928
Cortex-A7 TRM result 00.291 00.375 00.329
PMU metrics c1=000005 c2=000016
mutex 000339/000193 000371/000193 00.376 00.412 00.386 01.803
Cortex-A7 TRM result 00.375 00.458 00.413
PMU metrics c1=000006 c2=000028tx_user.h содержит
#define TX_DISABLE_ERROR_CHECKING
#define TX_INLINE_THREAD_RESUME_SUSPENDPerfomance info CPUclk=0900MHz
service_name min[cyc/inst] max[cyc/inst] min[uS] max[uS] avg[uS] cpi
queue 000272/000142 000353/000142 00.302 00.392 00.322 02.035
Cortex-A7 TRM result 00.291 00.375 00.345
PMU metrics c1=000004 c2=000016
eventFlag 000303/000161 000343/000161 00.336 00.381 00.342 01.913
Cortex-A7 TRM result 00.333 00.416 00.373
PMU metrics c1=000003 c2=000017
semaphore 000240/000132 000262/000132 00.266 00.291 00.270 01.840
Cortex-A7 TRM result 00.291 00.333 00.294
PMU metrics c1=000002 c2=000014
mutex 000333/000182 000358/000182 00.370 00.397 00.374 01.846
Cortex-A7 TRM result 00.375 00.416 00.391
PMU metrics c1=000007 c2=000025
Оценка скорости реакции RTOS на события