Цитата(Valentine Loginov @ Sep 18 2014, 12:16)

Очень интересно, спасибо! А то сейчас на pic'ах грустно с качественными ОСРВ, а в своё время tn_kernel очень нравился
Хотелось бы узнать: есть ли возможность посмотреть проекты с unit-test'ами? Тесты очень часто помогают понять логику API больше, чем документация. Да и вообще интересно на какой платформе тестируется: x86, pic-mips или совместно?
Спасибо за интерес =)
Проект с юнит-тестами пока один, гоняю в железе на своем PIC32MX440F512H (камень, использующийся в текущем проекте на моей работе), вывожу лог в UART.
Конечно я покажу его, но сразу предупрежу: его код пока не такой вылизанный: к сожалению, мое open-source время ограничено и на все не хватает, но когда я смогу найти время и причесать его, то размещу ссылку на странице самого ядра.
Как в целом работают тесты: есть задача с самым высоким приоритетом (типа test_director), она создает себе рабочие задачи(A, B, C, ...), создает объекты (например, мютексы: M1, M2, ...), говорит задачам что делать, и проверяет, что после этого получилось.
Вкратце, код тестов выглядят примерно так:
Код
TNT_TEST_COMMENT("A locks M1");
TNT_ITEM__SEND_CMD_MUTEX(TNT_TASK__A, MUTEX_LOCK, TNT_MUTEX__1);
TNT_ITEM__WAIT_AND_CHECK_DIFF(
TNT_CHECK__MUTEX(TNT_MUTEX__1, HOLDER, TNT_TASK__A);
TNT_CHECK__MUTEX(TNT_MUTEX__1, LOCK_CNT, 1);
TNT_CHECK__TASK(TNT_TASK__A, LAST_RETVAL, TERR_NO_ERR);
);
TNT_TEST_COMMENT("B tries to lock M1 -> B blocks, A has priority of B");
TNT_ITEM__SEND_CMD_MUTEX(TNT_TASK__B, MUTEX_LOCK, TNT_MUTEX__1);
TNT_ITEM__WAIT_AND_CHECK_DIFF(
TNT_CHECK__TASK(TNT_TASK__B, LAST_RETVAL, TWORKER_MAN__LAST_RETVAL__UNKNOWN);
TNT_CHECK__TASK(TNT_TASK__B, WAIT_REASON, TSK_WAIT_REASON_MUTEX_I);
TNT_CHECK__TASK(TNT_TASK__A, PRIORITY, priority_task_b);
);
TNT_TEST_COMMENT("A deletes M1");
TNT_ITEM__SEND_CMD_MUTEX(TNT_TASK__A, MUTEX_DELETE, TNT_MUTEX__1);
TNT_ITEM__WAIT_AND_CHECK_DIFF(
TNT_CHECK__MUTEX(TNT_MUTEX__1, HOLDER, TNT_TASK__NONE);
TNT_CHECK__MUTEX(TNT_MUTEX__1, LOCK_CNT, 0);
TNT_CHECK__MUTEX(TNT_MUTEX__1, EXISTS, 0);
TNT_CHECK__TASK(TNT_TASK__A, LAST_RETVAL, TERR_NO_ERR);
TNT_CHECK__TASK(TNT_TASK__A, PRIORITY, TNT_BASE_PRIORITY);
TNT_CHECK__TASK(TNT_TASK__B, LAST_RETVAL, TERR_DLT);
TNT_CHECK__TASK(TNT_TASK__B, WAIT_REASON, TSK_WAIT_REASON_DQUE_WRECEIVE);
);
Здесь мы сначала выводим в лог дословный коммент "A locks M1", потом отправляем команду задаче A, чтобы она заблокировала мютекс 1. После чего ждем некоторое время, и проверяем: владелез мютекса 1 должна быть задача А, кол-во блокировок должно быть 1, последнее возвращенное значение - TERR_NO_ERR. Ну и так далее, код тестов должен быть понятен без лишних комментариев (я надеюсь).
В лог при этом выводится следующее:
Код
[18.09 14:04:03] [I]: tnt_item_proceed():0910: ----- Command to task A: lock mutex M1 (0xa0006f14)
[18.09 14:04:03] [I]: tnt_item_proceed():0937: Wait 80 ticks
[18.09 14:04:03] [I]: _task_worker():0199: [Task A]: locking mutex (0xa0006f14)..
[18.09 14:04:03] [I]: _task_worker():0206: [Task A]: mutex (0xa0006f14) locked
[18.09 14:04:03] [I]: _task_worker():0160: [Task A]: waiting for command..
[18.09 14:04:03] [I]: tnt_item_proceed():0955: Checking:
[18.09 14:04:03] [I]: * Task A: priority=6 (as expected), wait_reason=DQUE_WRECEIVE (as expected), last_retval=TERR_NO_ERR (as expected), state=WAIT (as expected)
[18.09 14:04:03] [I]: * Task B: priority=5 (as expected), wait_reason=DQUE_WRECEIVE (as expected), last_retval=NOT-YET-RECEIVED (as expected), state=WAIT (as expected)
[18.09 14:04:03] [I]: * Mutex M1: holder=A (as expected), lock_cnt=1 (as expected), exists=yes (as expected)
[18.09 14:04:03] //-- B tries to lock M1 -> B blocks, A has priority of B (line 90 in ../source/appl/appl_tntest/appl_tntest_mutex.c)
[18.09 14:04:03] [I]: tnt_item_proceed():0910: ----- Command to task B: lock mutex M1 (0xa0006f14)
[18.09 14:04:03] [I]: tnt_item_proceed():0937: Wait 80 ticks
[18.09 14:04:03] [I]: _task_worker():0199: [Task B]: locking mutex (0xa0006f14)..
[18.09 14:04:03] [I]: tnt_item_proceed():0955: Checking:
[18.09 14:04:03] [I]: * Task A: priority=5 (as expected), wait_reason=DQUE_WRECEIVE (as expected), last_retval=TERR_NO_ERR (as expected), state=WAIT (as expected)
[18.09 14:04:03] [I]: * Task B: priority=5 (as expected), wait_reason=MUTEX_I (as expected), last_retval=NOT-YET-RECEIVED (as expected), state=WAIT (as expected)
[18.09 14:04:03] [I]: * Mutex M1: holder=A (as expected), lock_cnt=1 (as expected), exists=yes (as expected)
[18.09 14:04:03] //-- A deletes M1 (line 99 in ../source/appl/appl_tntest/appl_tntest_mutex.c)
[18.09 14:04:03] [I]: tnt_item_proceed():0910: ----- Command to task A: delete mutex M1 (0xa0006f14)
[18.09 14:04:03] [I]: tnt_item_proceed():0937: Wait 80 ticks
[18.09 14:04:03] [I]: _task_worker():0227: [Task A]: deleting mutex (0xa0006f14)..
[18.09 14:04:03] [I]: _task_worker():0208: [Task B]: mutex (0xa0006f14) locking failed with err=-10
[18.09 14:04:03] [I]: _task_worker():0160: [Task B]: waiting for command..
[18.09 14:04:03] [I]: _task_worker():0234: [Task A]: mutex (0xa0006f14) deleted
[18.09 14:04:03] [I]: _task_worker():0160: [Task A]: waiting for command..
[18.09 14:04:03] [I]: tnt_item_proceed():0955: Checking:
[18.09 14:04:03] [I]: * Task A: priority=6 (as expected), wait_reason=DQUE_WRECEIVE (as expected), last_retval=TERR_NO_ERR (as expected), state=WAIT (as expected)
[18.09 14:04:03] [I]: * Task B: priority=5 (as expected), wait_reason=DQUE_WRECEIVE (as expected), last_retval=TERR_DLT (as expected), state=WAIT (as expected)
[18.09 14:04:03] [I]: * Mutex M1: holder=NONE (as expected), lock_cnt=0 (as expected), exists=no (as expected)
Если что-то пойдет не так, то будет не "as expected", а подробности, что именно ожидалось и что получилось, и тесты останавливаются.
Репозиторий можно получить так (будет скачан "environment" репозиторий с несколькими подрепами, одна из подреп - собственно, сам проект с тестами, остальные - либы, их немного) :
hg clone
http://hg.dfrank.ru/rtos_check/_env rtos_check
Файл со всеми тестами мютексов:
hg.dfrank.ru/rtos_check/project_common/files/tip/fw_tmp_bk16/appl/source/appl/appl_tntest/appl_tntest_mutex.cФайл со всеми тестами задач (пока их немного) :
hg.dfrank.ru/rtos_check/project_common/files/tip/fw_tmp_bk16/appl/source/appl/appl_tntest/appl_tntest_tasks.cЛог всех тестов:
http://vpaste.net/gsfGvВот таким образом. Уже много раз эти тесты сразу указывали мне, когда я где-то что-то ломал