реклама на сайте
подробности

 
 
> Вышла TNKernel 2.7
yuri_t
сообщение Jul 6 2013, 08:46
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 163
Регистрация: 24-08-05
Пользователь №: 7 937




Эта версия посвящена ,в основном, устранению накопившихся багов.

Огромное спасибо всем участникам проекта TNKernel !!!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Valentine Logino...
сообщение Sep 18 2014, 08:16
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 78
Регистрация: 7-04-10
Из: Пушкино
Пользователь №: 56 462



Очень интересно, спасибо! А то сейчас на pic'ах грустно с качественными ОСРВ, а в своё время tn_kernel очень нравился sm.gif
Хотелось бы узнать: есть ли возможность посмотреть проекты с unit-test'ами? Тесты очень часто помогают понять логику API больше, чем документация. Да и вообще интересно на какой платформе тестируется: x86, pic-mips или совместно?
Go to the top of the page
 
+Quote Post
dimonomid
сообщение Sep 18 2014, 10:17
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 16-09-14
Пользователь №: 82 835



Цитата(Valentine Loginov @ Sep 18 2014, 12:16) *
Очень интересно, спасибо! А то сейчас на pic'ах грустно с качественными ОСРВ, а в своё время tn_kernel очень нравился sm.gif
Хотелось бы узнать: есть ли возможность посмотреть проекты с 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

Вот таким образом. Уже много раз эти тесты сразу указывали мне, когда я где-то что-то ломал sm.gif
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- yuri_t   Вышла TNKernel 2.7   Jul 6 2013, 08:46
- - megajohn   благодарю, но хочу высказать свои хотелки, в целях...   Jul 9 2013, 11:11
- - Grape   Спасибо! немножко дополнений... Кодdiff -urN...   Jul 25 2013, 10:21
|- - megajohn   небольшие рекомендации от меня: не использовать pr...   Aug 7 2013, 12:26
|- - megajohn   a вce-тaки пoлeзнaя фичa peaлизoвaнa idle_user_cb ...   Oct 3 2013, 07:19
|- - megajohn   9. в фyнкциях tn_event_clear и tn_task_create пров...   Oct 4 2013, 09:04
- - Almaz_emb   Добрый день! Сразу же прошу прощения если мой ...   Jul 15 2014, 16:47
- - A. Fig Lee   Кстати, а есть сравнение TNkernel с Coocox?   Jul 15 2014, 17:00
- - dimonomid   Всем привет. Сразу перейду к делу, после чего изл...   Sep 17 2014, 21:42
|- - megajohn   прикрутил к TnKernel систему runtime контроля стек...   Oct 27 2015, 16:18
- - Intel4004   А порт для Cortex-M0(M0+) существует?   Oct 29 2015, 23:40
- - megajohn   Цитата(Intel4004 @ Oct 30 2015, 03:40) А ...   Oct 30 2015, 09:49
- - Intel4004   Цитата(megajohn @ Oct 30 2015, 12:49) где...   Oct 30 2015, 14:09


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th August 2025 - 21:09
Рейтинг@Mail.ru


Страница сгенерированна за 0.02123 секунд с 7
ELECTRONIX ©2004-2016