Обновить

Комментарии 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=000028

tx_user.h содержит

#define TX_DISABLE_ERROR_CHECKING
#define TX_INLINE_THREAD_RESUME_SUSPEND
Perfomance 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
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации