Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вышла TNKernel v.2.6
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы
yuri_t
TNKernel v.2.6 имеет порты ARM, Cortex-M3 и новый порт TI MSP430x.

Переключение контекста в TNKernel v.2.6 работает заметно быстрее (порты ARM, Cortex-M3) по сравнению с предыдущими версиями.
The mutex ceiling protocol в версии 2.6 более "lightweight" по сравнению с предыдущими версиями - в соревновании "скорость против features" победила скорость (на данный момент).
Код mutex ceiling protocol в версии 2.6 основывается на коде. написанном Vyacheslav Ovsiyenko для его версии TNKernel.

Спасибо Vyacheslav Ovsiyenko, Audrius Urmanavicius, Alex Borisov, Michael Fisher за их улучшения и замечания.


http://www.tnkernel.com
dENIM
под мелкочип пока не предвидится?
yuri_t
Цитата(dENIM @ Mar 2 2011, 16:14) *
под мелкочип пока не предвидится?


Это надо обращаться к Александру Борисову.


Intel4004
А насколько критично выравнивание стеков на 8?
В исходниках не нашел ничего , что мне запрещает вместо

#if defined (__ICCARM__) // IAR ARM
#pragma data_alignment=8
#endif
align_attr_start unsigned int task_xxx_stack[TASK_XXX_SIZE] align_attr_end;

написать просто

unsigned int task_xxx_stack[TASK_XXX_SIZE];

Получится выравнивание на 4 (для ARM7 и Cortex).
aaarrr
Цитата(Intel4004 @ Mar 25 2011, 23:09) *
Получится выравнивание на 4 (для ARM7 и Cortex).

Вот как раз для ARM7 и Cortex и нужно выравнивание на 8.
Intel4004
Цитата(aaarrr @ Mar 25 2011, 23:16) *
Вот как раз для ARM7 и Cortex и нужно выравнивание на 8.

Для чего? Насколько критично?
Хотелось сделать странное так:
Код
int RTOS_TaskCreate(void (*func)(void *param), int stack_size, int priority)
{
TN_TCB *TCB;
unsigned int *Stack;
TCB = malloc(sizeof(*TCB));
Stack = malloc(sizeof(*Stack) * stack_size);
TCB->id_task = 0;
return tn_task_create(TCB, func, priority, Stack+stack_size-1, stack_size, NULL/*TCB or Stack*/, TN_TASK_START_ON_CREATION);
}

но выяснилось, что malloc и так на 8 выравнивает.
aaarrr
Цитата(Intel4004 @ Mar 26 2011, 12:34) *
Насколько критично?

Плавучка может отвалиться без выравнивания. Вообще, это требование стандарта, поэтому критично на 100%.
dac
QUOTE (yuri_t @ Mar 2 2011, 01:00) *
TNKernel v.2.6 имеет порты ARM, Cortex-M3 и новый порт TI MSP430x.

пример для STM32 под новые библиотеки версии 3 будет? а то уже два дня разбираюсь sm.gif боюсь еще дня 3-4 провожусь sad.gif
LightElf
Попытался портировать TNNet на LM3S6965 и встал на грабли, уж больно его Ethernet-контроллер не похож на LPC. Может кто-нибудь портировал стек на это чудо?
aaarrr
Цитата(LightElf @ Apr 6 2011, 19:12) *
Попытался портировать TNNet на LM3S6965 и встал на грабли, уж больно его Ethernet-контроллер не похож на LPC.

А какие с ним трудности? EMAC у LM3S простой совсем.
LightElf
QUOTE (aaarrr @ Apr 6 2011, 19:18) *
А какие с ним трудности? EMAC у LM3S простой совсем.

Трудности не с пониманием EMAC у LM3S, а с прикручиванием его к TNNet. Я не совсем понимаю, что от драйвера требуется.
LightElf
Юрий,
возникли вопросы по использованию буферов в TN-Net.
1) Правильно ли я понимаю, что при отправке IP пакета он будет состоять из минимум двух TN_MBUF, в одном заголовок Ethernet, во втором - сам пакет?
2) Смысл существования HI_BUF, если стек всяко использует цепочку из MID_BUF для больших пакетов? Специфика контроллера Ethernet у LPC?
3) Вы возможно сталкивались с контроллером Ethernet у LM3S. Нет ли у вас идей, как лучше его подружить с TN-Net?
dac
QUOTE (yuri_t @ Mar 2 2011, 01:00) *
TNKernel v.2.6 имеет порты ARM, Cortex-M3 и новый порт TI MSP430x.

вопрос по функции tn_event_wait при вызове функции, если ожидаемые флаги не установлены, т.е. функция возвращается с параметром TERR_TIMEOUT, не возвращает значение в параметр " * p_flags_pattern".
имхо это не совсем правильно. приведу пример:
мне нужно быстро разбудить задачу по одному из битов битовой маски флага, а по другому не критично, например достаточно его проверять каждые 100 системных тиков. поэтому я вызываю функцию в следующем виде:
CODE
rc = tn_event_wait(&event_all_uart,
                EVENT_1,
                TN_EVENT_WCOND_OR, &flag, 100);
// ожидалось, что будет работать так
if (flag & EVENT_2) {...}

на самом деле для проверки некритичного флага EVENT_2, мне придется дополнительно вызывать функцию tn_event_wait_polling с маской 0xFFFFFFFF предварительно обнулив флаг, т.е. совершаю несколько дополнительных неоправданных действий, тем более что переменная все равно создана, занимает память
CODE
rc = tn_event_wait(&event_all_uart,
                EVENT_1,
                TN_EVENT_WCOND_OR, &flag, 100);

flag = 0;
rc = tn_event_wait_polling(&event_all_uart,
                0xFFFFFFFF,
                TN_EVENT_WCOND_OR, &flag);
if (flag & EVENT_1) {...}
if (flag & EVENT_2) {...}

еще ситуация усугубляется, если флаг был выставлен, затем очищен функцией tn_event_clear, но перед вызовом функции n_event_wait не обнулен, получается что по таймауту в переменной flag либо остается прошлое значение, либо вообще случайное. и флаги которые не вызывают "подъем" задачи мы вообще не видим sad.gif

yuri_t
Цитата(LightElf @ Apr 7 2011, 09:47) *
1) Правильно ли я понимаю, что при отправке IP пакета он будет состоять из минимум двух TN_MBUF, в одном заголовок Ethernet, во втором - сам пакет?
2) Смысл существования HI_BUF, если стек всяко использует цепочку из MID_BUF для больших пакетов? Специфика контроллера Ethernet у LPC?
3) Вы возможно сталкивались с контроллером Ethernet у LM3S. Нет ли у вас идей, как лучше его подружить с TN-Net?


1) Да
2) HI_BUF нужен только для приема - чтобы не городить цепочку DMA буферов(длина принимаемого пакета еще неизвестна,
а память под него выделять уже надо - поэтому здесь используется HI_BUF размером MTU)
3) C Ethernet у LM3S не работал

Цитата(dac @ Apr 29 2011, 06:17) *
мне нужно быстро разбудить задачу по одному из битов битовой маски флага, а по другому не критично, например достаточно его проверять каждые 100 системных тиков.


Ожидание события в синхронизационном элементе ( в том числе и Event) надо использовать только тогда, когда по этому событию задача должна проснуться и получить управление ( т.е. проверять флаг в Event каждые 100 системных тиков идеологически неверно - Event не предназначен для такого использования).
Почему бы в этом случае не использовать просто глобальную переменную и проверять ее по timeout Вашего Event ?







dac
QUOTE (yuri_t @ May 2 2011, 14:54) *
Ожидание события в синхронизационном элементе ( в том числе и Event) надо использовать только тогда, когда по этому событию задача должна проснуться и получить управление ( т.е. проверять флаг в Event каждые 100 системных тиков идеологически неверно - Event не предназначен для такого использования).
Почему бы в этом случае не использовать просто глобальную переменную и проверять ее по timeout Вашего Event ?

Глобальные переменные в общем случае зло sm.gif и если есть готовый механизм флагов, почему его не использовать, тем более что нужен один бит, и городить ради этого отдельную сущность в виде семафора или глобальной переменной кажется лишним. Впрочем, я только учусь работать с ОС, и возможно еще не проникся идеологией sm.gif
ЗЫ: похоже теперь плотно подсел на TNKernel, уж очень понравилась. Спасибо!
LightElf
QUOTE (yuri_t @ May 2 2011, 12:54) *
2) HI_BUF нужен только для приема - чтобы не городить цепочку DMA буферов(длина принимаемого пакета еще неизвестна,
а память под него выделять уже надо - поэтому здесь используется HI_BUF размером MTU)

Вроде понял, но не согласен с таким подходом. ИМХО собрать цепочку из MID_BUF в конечном счете будет выгоднее с точки зрения использования памяти.

QUOTE (yuri_t @ May 2 2011, 12:54) *
3) C Ethernet у LM3S не работал

Там есть один нюанс - желательно чтобы в первом TN_MBUF перед ethernet заголовком было два пустых байта для выравнивания. Тогда пересылать данные можно будет выровненными 32-битными словами. Пока не могу понять, как это осуществить красиво, не вторгаясь сильно в исходники.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.