Помогите! Проблема с мьютексами таймера.

44 views
Skip to first unread message

Антон Федосов

unread,
Jun 7, 2017, 1:57:47 PM6/7/17
to uOS embedded
Помогите, пожалуйста, есть проблема, может кто сталкивался с подобным?
Делаем проект для 1892ВМ10Я. Программа и данные в CRAM, все максимально просто.
Не выполняется тест таймера "из коробки". Начинает работать только после некоторых неочевидных изменений, найденных методом тыка.

Первый вариант программы:
ARRAY (stack_task_1, 1024);
timer_t timer
;

static void task_1(void* data)
{
    debug_printf
("Task created: task_1\r");
   
while(1)
   
{
        mutex_wait
(&timer.lock);
        debug_printf
("msr\r");
   
}
}

void uos_init(void)
{
    debug_printf
("Start master\r");
    debug_printf
("Core frequency: %d KHz\r", KHZ);
    debug_printf
("Creating tasks\r");
    task_create
(task_1, 0, "task_1", 1, stack_task_1, sizeof(stack_task_1));
    timer_init
(&timer, KHZ, 1000);
}
Эквивалентен тесту таймера "из коробки". Задача не реагирует на мьютекс. Как будто не посылается сигнал от таймера.
Выдача:
Start master
Core frequency: 80000 KHz
Creating tasks
Task created: task_1

Второй вариант:
static timer_t timer;
Сделал объект таймера статическим. Получаем непрохождение ассерта в функции mutex_activate через секунду (тогда, когда таймер посылает сигнал, видимо).
Выдача:
Start master
Core frequency: 80000 KHz
Creating tasks
Task created: task_1

Assertion failed in function `mutex_activate':

D:/workspace_mips/src_150_v1/uos/examples/mips-elvees/../../sources/kernel/main.c, 65: t->wait == m

Третий вариант:
mutex_t mut_lock;
static timer_t timer;
Создал объект мьютекса, который не использую нигде. Сигнал отрабатывается один раз, а потом получаем другой ассерт.
Выдача:
Start master
Core frequency: 80000 KHz
Creating tasks
Task created: task_1
msr

Assertion failed in function `mutex_wait':

D:/workspace_mips/src_150_v1/uos/examples/mips-elvees/../../sources/kernel/msignal.c, 58: task_current->wait == 0


Task      Address     Prio        Stack    Space    Msg    Ticks

idle     b80100b0     0     b8010168    4    (nil)    1

task_1     b801023c    *1     b8010530    500    (nil)    2

    Waiting for 0xb801023c

    Owning 0xb8010038 0xb80100b0 0xb801023c 0xb8010038 0xb80100b0 0xb801023c 0xb8010038 0xb80100b0 0xb801023c...

task_1.stack {0xb80105b0/0xb80105f0..0xb8010530/0xb80104f0, 0xb8005810, 0xb8010560}

[  task_1.b80105ec]  b8002c60  b80105f0  00000000  b8007bf0

[  task_1.b80105dc]  0000003a  b8007b98  b8007c40  00000001

[  task_1.b80105cc] *b8005810  b80105d0  00000000  0000009f

[  task_1.b80105bc]  00000000  10001c00  b8010038 >b8010002

[  task_1.b80105ac]  b8005810  b8010530  b80105b0  b8007638

[  task_1.b801059c]  b8005a5c  b80105a0  00000001  00000020

[  task_1.b801058c]  00000000  b8010588  b80104f0  b80105f0

[  task_1.b801057c]  b8010560  b8005810  b80104f0  b8010530

[  task_1.b801056c]  ffffffff  ffffffff  00000020  b8010560

[  task_1.b801055c]  b8010560  b8010560  b8010564  b8010550

[  task_1.b801054c]  b801000d  b801056c  b8008240  b801001c

[  task_1.b801053c]  b8000d6c  b8010540  b8005810 =10001c00

[  task_1.b801052c]  10000800  b8010538  00000000  10001c00

[  task_1.b801051c]  10001c00  b8010528  00000062  38303130

[  task_1.b801050c]  35306300  35306300  00000000  00000000

[  task_1.b80104fc]  00000000  0000000a  ffffffff  00000000


*** Please report this information

*** System halted.

Четвертый вариант:
mutex_t mut_lock;
mutex_t mut_decisek
;
static timer_t timer;
Добавил еще один "лишний" мьютекс. Заработало все как надо.
Start master
Core frequency: 80000 KHz
Creating tasks
Task created: task_1
msr
msr
msr
msr

В чем дело? Это с памятью косяк? У кого-нибудь подобное было?
test_timer.zip

Дмитрий Подхватилин

unread,
Jun 7, 2017, 2:44:30 PM6/7/17
to uOS embedded
Добрый день!

Попробуйте скачать ветку stable и запустить тест на ней.
И ещё есть сомнения, что получится установить период таймера в 1000 мс - может быть переполнение регистра таймера (это предположение). Попробуйте сделать период поменьше, например, 100 мс, для проверки.

7 июня 2017 г., 18:26 пользователь Антон Федосов <izon...@gmail.com> написал:

--
Вы получили это сообщение, поскольку подписаны на группу "uOS embedded".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес uos-embedded+unsubscribe@googlegroups.com.
Чтобы отправлять сообщения в эту группу, отправьте письмо на электронный адрес uos-em...@googlegroups.com.
Чтобы зайти в группу, перейдите по ссылке https://groups.google.com/group/uos-embedded.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

Александр Литягин

unread,
Jun 7, 2017, 4:38:23 PM6/7/17
to uOS embedded
а какую версию пользуете?


07 июня 2017 г. 20:57 пользователь "Антон Федосов" <izon...@gmail.com> написал:
--

Александр Литягин

unread,
Jun 7, 2017, 4:45:00 PM6/7/17
to uOS embedded
А еще смущает что вызадачу которая использует таймер запускаете раньше чем таймер - если сначала таймер настраивать, что будет?


07 июня 2017 г. 20:57 пользователь "Антон Федосов" <izon...@gmail.com> написал:
Помогите, пожалуйста, есть проблема, может кто сталкивался с подобным?

--

Антон Федосов

unread,
Jun 9, 2017, 7:25:50 AM6/9/17
to uOS embedded
Сам не знаю, какую версию использую. Перешел по наследству чужой проект. Где версию посмотреть не нашел.
Скачал с гитхаба ветку master и не могу скомпилировать. Есть ли  инструкция, как это сделать?
makefile из папки examples/mips-elvees пишет пути в стиле unix...

Антон Федосов

unread,
Jun 9, 2017, 7:30:12 AM6/9/17
to uOS embedded
Нет. Никакой разницы.

среда, 7 июня 2017 г., 23:45:00 UTC+3 пользователь Александр Литягин написал:
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес uos-embedded...@googlegroups.com.

Дмитрий Подхватилин

unread,
Jun 9, 2017, 8:15:01 AM6/9/17
to uOS embedded
У нас так сложилось, что есть две версии (то бишь ветки).
В ветке master лежит версия от Александра Литягина. Я с ней не работал. Она довольно сильно отличается от того, что было. Можно попробовать работать с ней. Но если проект достался по наследству, то, вероятно, он собирался со "старой" версией и проще с ней для начала собраться.

Продолжение "старой" версии uOS лежит в том же репозитории на гитхабе, но в ветке stable. Примеры там точно рабочие.
Компилируется всё командой make из example/mips-elvees. Если отдельные тесты не компилируются, можно временно их закомментировать в Makefile. В target.cfg в переменной PROCESSOR должен быть указан используемый процессор (там закомментарено всё, что поддерживается).




9 июня 2017 г., 14:30 пользователь Антон Федосов <izon...@gmail.com> написал:
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес uos-embedded+unsubscribe@googlegroups.com.

Александр Литягин

unread,
Jun 9, 2017, 10:58:18 AM6/9/17
to uOS embedded
В моей версии работа велась под вендой. я использовал шаблоны проектов MCStudio4 которые лежат в utils/libuos.aside - в отличие от родного проекта он присоединяет сорсы уоси линкованными папками, и как следствие я могу работать над одним общим репозиторием используя несколько проектов с разными настройками.
настройки я выделил в хедеры sources/uos-confxxx.h - там вроде коментариев хватает
Прямо так чтобы из коробки у меня собиралось только то что ЭЛВИС предлагает в качестве шаблоного проекта. в автосгенерированный проект добавляет в песочницу проект статической билиотеки, и собственно проект приложения. в такой связке оно хорошо загружается и отлаживается. использование моей версии проекта - с прилинкованными каталогами, както корявенько работало с их отладчиком. поэтому для отладки советую использовать классическую версию проектов - с тупым копированием исходников.
Если Вы таки потестируете мои результаты - будет запоздалая обратная связь. там я много нарубил в борьбе с галюнами. и кстати ваша бага у меня кажется ловилась, и так и не выяснил причину. просто в какойто момент пропала после добавления переменных глобальных. скорее всего она перелезла в другое место и била меня иначе. В борьбе с ней я пофиксил немного инициализацию стека МАЙН, инициализацию мутехов прерываний, таймера.

ЗЫ) Дмитрий - никогда не поздно моей ветке назначить свое имя, а мастер перескочить на стабильную версию.


пятница, 9 июня 2017 г., 15:15:01 UTC+3 пользователь Дмитрий Подхватилин написал:

Антон Федосов

unread,
Jul 6, 2017, 2:26:14 AM7/6/17
to uOS embedded
Спасибо большое! Ветка stable заработала сразу, сейчас спокойно делаем проект. Без вашей помощи пришлось бы обходиться без ОС. Спасибо.
Пока только одно нарекание было (может это ОС, а может я дурак): кажется, не получается выставить приоритет отличный от единицы медленному обработчику прерывания, тоже хальт. Но пока толком с этой ситуацией не разбирался, вроде и нужды особой не было, обходимся так. Потом сделаю специальный тестик и отпишусь.
Всем спасибо, еще раз.


пятница, 9 июня 2017 г., 15:15:01 UTC+3 пользователь Дмитрий Подхватилин написал:
У нас так сложилось, что есть две версии (то бишь ветки).

Александр Литягин

unread,
Jul 6, 2017, 3:54:39 AM7/6/17
to uOS embedded
Здравствуйте Антон!
По Вашим первым журналам узнал наконец свою ветку оси. Ассерты которые подымались мне ненравятся - действительно похоже на использование неинициализированых структур таймера или мутехов.
можете ли проверить мое предположение?
в функции
void uos_init(void)
{
    debug_printf
("Start master\r");
    debug_printf
("Core frequency: %d KHz\r", KHZ);
    debug_printf
("Creating tasks\r");
    task_create
(task_1, 0, "task_1", 1, stack_task_1, sizeof(stack_task_1));
    timer_init
(&timer, KHZ, 1000);
}

сначала проинициализируйте таймер, а потом запустите нитку его использующую

    timer_init(&timer, KHZ, 1000);
    task_create(task_1, 0, "task_1", 1, stack_task_1, sizeof(stack_task_1));
сложно будет показать лог того что получилось?
 

четверг, 6 июля 2017 г., 9:26:14 UTC+3 пользователь Антон Федосов написал:
Reply all
Reply to author
Forward
0 new messages