Помогите, пожалуйста, есть проблема, может кто сталкивался с подобным?
Делаем проект для 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
Второй вариант:
Сделал объект таймера статическим. Получаем непрохождение ассерта в функции 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
В чем дело? Это с памятью косяк? У кого-нибудь подобное было?