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

 
 
> TNKernel будет ли порт для cortex m4 ?
dimanisu
сообщение Feb 9 2013, 20:26
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 4-10-07
Пользователь №: 31 055



Здравствуйте!

У меня вопрос к разработчику ОС Юрию и всем, кто допиливал ось под себя(VslavX и т.д.), озвученный в названии темы. Будет ли такой порт? Планирую работать с STM32f4.
Планируется ли дальнейшее развитие TNKernel?

Заранее благодарен за ответы.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
VslavX
сообщение Feb 21 2013, 20:01
Сообщение #2


embarrassed systems engineer
*****

Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038



Реализовал оба метода переключения контекста.
Метод 1: использование автоматического "ленивого" сохранения контекста FPU в стеке, полностью аналогичен коду порта scmRTOS
Метод 2: метод переключения контекста по требованию. Имеется системная переменная - указатель на TCB задачи, контекст которой загружен в данный момент в регистры FPU. При переключении задачи эта переменная сравнивается с TCB загружаемой задачи. При совпадении доступ к FPU разрешается через биты регистра CPACR, иначе доступ запрещен. Когда текущая задача, не владеющая контекстом FPU пытается выполнить плавучую операцию - происходит исключение, сохраняющее регистры FPU в TCB задачи-владельца, и загружающее нужный контекст текущей задачи.
Предварительно потестировал оба метода.
Для начала картинка GCC<->IAR без поддержки FPU
Прикрепленное изображение

Мой взгляд, разницы принципиальной нет.

Теперь картинка сравнения разных методов, для компилятора GCC.
Прикрепленное изображение

FPU1 - метод 1
FPU2 - метод 2
none - ни одна из двух тестовых задач не обращается к FPU
Task1 - только первая тестовая задач обращается к FPU
Task2 - только вторая тестовая задач обращается к FPU
Task12 - первая и вторая тестовая задачи обращаются к FPU

Для метода 1 следует помнить, что FPCA бит в регистре CONTROL является sticky - то есть если задача хотя бы раз (возможно в далеком прошлом) обратилась к FPU и теперь про него вообще забыла - крайняя левая картинка уже использоваться не будет - работает одна из правых. С явным сбросом FPCA могут быть проблемы, так как компилятор может неявно использовать FPU даже в отсутствие операций с float/double.

Для метода 2 есть недостаток - не поддерживается FPU в прерываниях/исключениях. В связи с этим для гарантии код операционной системы следует компилировать с оцпией -mfloat-abi=soft. А приложение и математические библиотеки с опцией softfp. Иначе оно не будет линковаться. На ассемблер разумеется никаких ограничений.

Еще немного потестирую и буду прикручивать к официальной версии 2.6. Кстати, там видно что пооптимизировать, предложу модификации.

Update: еще покрутил ассемблерный листинг - для метода 2 времянки еще улучшились немного. На крайней правой нижней картинке теперь общее время 3.73мкс. Можно еще уменьшить за счет удаления всяких проверок (типа не пришло ли исключение из режима обработчика), но это уже может сказаться на надежности.

Update 2: у меня тут префетч из флеша в тесте выключался оказывается, почему то заметно влияло только на самую нижнуюю правую картинку - итого полное время 3,30 мкс для метода 2.

Update 3: тестирование прошло удачно, обновил картинку с цифрами. Префетч включен
Прикрепленное изображение
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Feb 22 2013, 02:59
Сообщение #3


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Очень интересно. Только я не понял, как читать осциллограммыsm.gif
Сначала думал, что жёлтый луч - это одна задача, синий - вторая, а промежуток между ними - переключение контекста. Но потом засомневался - что-то уж очень маленькое время переключения контекста получается.
Что касаемо того, что gcc может использовать регистры FPU по своему желанию - это, по идее, достаточно легко обнаружить при отладке (и как-то изменить программу, чтоб это убрать).


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
VslavX
сообщение Feb 22 2013, 05:39
Сообщение #4


embarrassed systems engineer
*****

Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038



Цитата(AHTOXA @ Feb 22 2013, 04:59) *
Очень интересно. Только я не понял, как читать осциллограммыsm.gif

Сейчас я убегаю, поэтому - по быстрому - фрагмент тестового кода:

CODE

#define TST_CONTEXT_STACK_SIZE 128

volatile BOOL tst_context_exit;
BYTE use_fpu;

void tst_context_task_func(void *param)
{
PTN_SEM sem;

//
// tst_printf("\r\nTest task started...\f");
//
sem = (PTN_SEM) param;
for(;;)
{
#ifdef _TEST_CONTEXT_PIN_2
IO_PORT_CLR(_TEST_CONTEXT_PIN_2);
#endif
tn_sem_acquire (sem, TN_WAIT_INFINITE);
#ifdef _TEST_CONTEXT_PIN_1
IO_PORT_CLR(_TEST_CONTEXT_PIN_1);
#endif
if (tst_context_exit)
{
//
// tst_printf("\r\nTest task completed...\f");
//
tn_task_exit(0, 0);
}
#if TN_SUPPORT_FPU
if (use_fpu & 2)
{
fpu_touch();
}
#endif
}
}

void io_test_context(void)
{
TN_SEM test_switch_sem;
TN_TCB test_task_clear;
PVOID test_task_stack[TST_CONTEXT_STACK_SIZE];
DWORD lock;

tst_printf("\r\nContext switch test...\f");
tst_context_exit = FALSE;

lock = hal_lock_interrupt();
{
#ifdef _TEST_CONTEXT_PIN_1
#if HAL_IO_SET_MODE
IO_SET_MODE(_TEST_CONTEXT_PIN_1);
#else
IO_PORT(_TEST_CONTEXT_PIN_1)->sFIO_DIR |= IO_MASK(_TEST_CONTEXT_PIN_1);
#endif
#endif
#ifdef _TEST_CONTEXT_PIN_2
#if HAL_IO_SET_MODE
IO_SET_MODE(_TEST_CONTEXT_PIN_2);
#else
IO_PORT(_TEST_CONTEXT_PIN_2)->sFIO_DIR |= IO_MASK(_TEST_CONTEXT_PIN_2);
#endif
#endif
}
hal_unlock_interrupt(lock);

tn_sem_create (&test_switch_sem, 1, 1);
tn_task_create(
(TN_TCB*)&test_task_clear,
tst_context_task_func,
IO_PRIMARY_PRIORITY-4,
&(test_task_stack[TST_CONTEXT_STACK_SIZE-1]),
TST_CONTEXT_STACK_SIZE,
(PVOID)&test_switch_sem,
TN_TASK_START_ON_CREATION);

for(;;)
{
tn_task_sleep(MS_TO_TICKS(1));
#ifdef _TEST_CONTEXT_PIN_1
IO_PORT_SET(_TEST_CONTEXT_PIN_1);
#endif
tn_sem_signal(&test_switch_sem);
#ifdef _TEST_CONTEXT_PIN_2
IO_PORT_SET(_TEST_CONTEXT_PIN_2);
#endif
if (tst_inkey() == 27)
{
tst_printf("\r\nStopping test task...\f");
while(test_task_clear.task_state != TSK_STATE_DORMANT)
{
tst_context_exit = TRUE;
tn_sem_signal(&test_switch_sem);
tn_task_sleep(MS_TO_TICKS(10));
}
tn_task_delete((TN_TCB*)&test_task_clear);
tn_sem_delete(&test_switch_sem);
tst_printf("\r\nTest completed...\f");
return;
}

#if TN_SUPPORT_FPU
if (use_fpu & 1)
{
fpu_touch();
}
#endif
}
}


Вечером продолжу тестирование и буду уже смотреть официальную ветку, там тоже есть что обсудить.
P.S. А префетч я отключал чтобы по-честному соревноваться с Вашими тестами scmRTOS - у Вас там ревизия проца старая sm.gif
P.P.S. Картинки уже устарели - есть круче sm.gif
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- dimanisu   TNKernel будет ли порт для cortex m4 ?   Feb 9 2013, 20:26
- - VslavX   Цитата(dimanisu @ Feb 9 2013, 22:26) У ме...   Feb 10 2013, 11:27
|- - dimanisu   Цитата(VslavX @ Feb 10 2013, 14:27) Если ...   Feb 10 2013, 12:38
- - kosyak©   А можно ссылку на тему, где обсуждалась идейка?   Feb 10 2013, 11:39
|- - AHTOXA   Вот здесь обсуждалась. Возможно пригодится ещё эта...   Feb 10 2013, 12:16
- - yuri_t   Если бы я стал писать порт TNKernel для Cortex-M4,...   Feb 11 2013, 09:58
|- - VslavX   Цитата(yuri_t @ Feb 11 2013, 11:58) Вячес...   Feb 12 2013, 06:16
- - dimanisu   VslavX! Благодарю за инициативу! Надеюсь,...   Feb 16 2013, 00:44
|- - VslavX   Цитата(dimanisu @ Feb 16 2013, 02:44) Бла...   Feb 18 2013, 12:34
- - yuri_t   Цитата(VslavX @ Feb 18 2013, 16:34) ... п...   Feb 18 2013, 14:00
|- - VslavX   Цитата(yuri_t @ Feb 18 2013, 16:00) В пос...   Feb 18 2013, 14:09
|- - SyncLair   Цитата(yuri_t @ Feb 18 2013, 18:00) В пос...   Feb 18 2013, 18:06
|- - IgorKossak   Цитата(SyncLair @ Feb 18 2013, 20:06) Не ...   Feb 18 2013, 18:13
- - _Pasha   linaro gcc еще есть, github gcc(linux'овые сбо...   Feb 18 2013, 18:41
|- - IgorKossak   Цитата(_Pasha @ Feb 18 2013, 20:41) linar...   Feb 18 2013, 20:53
- - VslavX   Выполнил черновой перенос существующего кода порта...   Feb 19 2013, 21:16
- - Volldemar   А вот с этим: arm-none-eabi кто нибудь, работал?   Feb 20 2013, 08:54
|- - AHTOXA   Именно про него парой постов выше упоминали аж нес...   Feb 20 2013, 09:45
|- - VslavX   Цитата(Volldemar @ Feb 20 2013, 10:54) А ...   Feb 20 2013, 09:47
|- - Volldemar   Цитата(VslavX @ Feb 20 2013, 11:47) Именн...   Feb 20 2013, 12:21
|- - IgorKossak   Цитата(VslavX @ Feb 20 2013, 11:47) Именн...   Feb 20 2013, 15:58
- - VslavX   По теме переключения контекста FPU по требованию (...   Feb 20 2013, 19:53
|- - AHTOXA   Я бы для начала попытался проанализировать плюсы и...   Feb 21 2013, 03:00
|- - VslavX   Цитата(AHTOXA @ Feb 21 2013, 05:00) Я бы ...   Feb 21 2013, 05:53
- - Valentine Loginov   Цитата(VslavX @ Feb 12 2013, 10:16) Порт ...   Feb 25 2013, 18:50
|- - VslavX   Цитата(Valentine Loginov @ Feb 25 2013, 20...   Feb 25 2013, 20:24
- - yuri_t   TNKernel порт для Cortex-M4, написанный VslavX, вы...   Mar 9 2013, 21:53
- - kosyak©   VslavX, а почему в Вашем порте пропала необходимос...   Jan 21 2014, 17:20
- - remi700   Здравствуйте! Из документации непонятно, можно...   Jan 30 2014, 17:36
- - Almaz_emb   Доброго времени суток) Безуспешно пытаюсь запустит...   Jul 16 2014, 05:10
- - Almaz_emb   Продолжаю мудохаться. Запустил порт для CortexM4 т...   Jul 16 2014, 21:22
|- - VslavX   Цитата(Almaz_emb @ Jul 17 2014, 00:22) Од...   Jul 19 2014, 20:10
- - kosyak©   Пробую запустить порт CortexM4F в своем проекте. ...   Sep 11 2014, 15:13
- - prgjz   Кто нибудь добился успеха с TN_SUPPORT_FPU? Прграм...   Oct 9 2014, 12:19
|- - AHTOXA   Цитата(prgjz @ Oct 9 2014, 18:19) Неужели...   Oct 9 2014, 14:54
- - prgjz   Да, мне нравится она! Использую в старых прое...   Oct 9 2014, 16:50
- - prgjz   упс... минимальный стек больше при FPU. Заработало...   Oct 10 2014, 16:34
- - LightElf   QUOTE (prgjz @ Oct 10 2014, 20:34) Не под...   Oct 30 2014, 15:34


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

 


RSS Текстовая версия Сейчас: 31st July 2025 - 18:25
Рейтинг@Mail.ru


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