Jump to content

    

TNKernel будет ли порт для cortex m4 ?

VslavX, а почему в Вашем порте пропала необходимость в функции tn_int_exit() (заменена пустым макросом)?

Как оно теперь работает?

Share this post


Link to post
Share on other sites

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

Из документации непонятно, можно ли при добавлении TNKernel в свой проект добавить tn_arm_disable_interrupts() и tn_arm_enable_interrupts() в уже имеющийся startup_stm32f4xx.s и вызывать tn_tick_int_processing() из обработчика SysTick_Handler() в stm32f4xx_it.c или обязательно заменить его на startup_hardware_init.s из комплекта TNKernel как в примере. Получается очень много исправлений по сравнению с тем что приходится делать например для FreeRTOS (только дописать __weak__ к обработчику SysTick), это нормально или делаю лишнее по незнанию (начал работать с ARM недавно, использовал шаблоны из CMSIS/SPL и FreeRTOS)?

Share this post


Link to post
Share on other sites

Доброго времени суток)

Безуспешно пытаюсь запустить TNKernel на STM32F401VC из Keil.

Порт для Cortex-M4 конфликтует с CMSIS core:

.\TNKernelF4\CortexM4F/tn_port_cm4f.h(166): error:  #247: function "__get_PRIMASK" has already been defined
  __get_PRIMASK(void)
.\TNKernelF4\CortexM4F/tn_port_cm4f.h(179): error:  #247: function "__set_PRIMASK" has already been defined
  __set_PRIMASK(unsigned long mask)

А порт для Cortex-M3 (как я понял из топика вполне работоспособен на Cortex-M4 ) падает в hardfault-handler:

#include <al_discovery_led.h>
#include <tn.h>


//----------- Tasks ----------------------------------------------------------

#define  TASK_0_PRIORITY 7
#define  TASK_0_STK_SIZE 128
align_attr_start unsigned int task_0_stack[TASK_0_STK_SIZE] align_attr_end;
TN_TCB  task_0;
void task_0_func(void);

//----------------------------------------------------------------------------

#define VECTACTIVE  (0x000001FF)
#define rNVIC_ICSR  (*((__IO unsigned int*)0xE000ED04))

void tn_cpu_int_enable()
{
   tn_arm_enable_interrupts();
}

//----------------------------------------------------------------------------
int tn_inside_int(void)
{
   if(rNVIC_ICSR & VECTACTIVE)
      return 1;
   return 0;
}


int main( void )
{
//    tn_arm_disable_interrupts();
    al_discovery_LED_init();
    tn_start_system();
    while(1)
    {
    }
}

void tn_app_init ()
{

   task_0.id_task = 0;
   tn_task_create(&task_0,               //-- task TCB
                 task_0_func,            //-- task function
                 TASK_0_PRIORITY,        //-- task priority
                 &(task_0_stack          //-- task stack first addr in memory
                    [TASK_0_STK_SIZE-1]),
                 TASK_0_STK_SIZE,        //-- task stack size (in int,not bytes)
                 NULL,                          //-- task function parameter
                 TN_TASK_START_ON_CREATION      //-- Creation option
                 );
}

//----------------------------------------------------------------------------
void task_0_func (void)
{
   for(;;)
   {
    al_discovery_LED_on(BLUE);
    tn_task_sleep(128);
   }
}

Поделитесь пожалуйста простейшим проектом под Keil)

Share this post


Link to post
Share on other sites

Продолжаю мудохаться.

Запустил порт для CortexM4 так, чтобы компилятор не ругался. Проект в прикрепленном файле.

Одна задача, которая зажигает светодиод. Падает в hardFault. Прошелся дебагером - проблемное место - функция tn_start_exe() ( достигается конец функции: строчка

                b       .                               // Never reach this

tnkernel.rar

Share this post


Link to post
Share on other sites
Одна задача, которая зажигает светодиод. Падает в hardFault. Прошелся дебагером - проблемное место - функция tn_start_exe() ( достигается конец функции: строчка
                b       .                               // Never reach this

А какой у Вас PendSV_Handler() работает? Судя по всему из файла startup_stm32f401xx.s, а должен бы из tn_port_cm4f_asm.s. Ну и для нормальной работы TN нужен системный таймер, функция tn_tick_int_processing() должна периодически вызываться из прерывания системного таймера.

 

Share this post


Link to post
Share on other sites

Пробую запустить порт CortexM4F в своем проекте.

При TN_SUPPORT_FPU = 0 и TN_SUPPORT_FPU = 1 работает без проблем.

А при TN_SUPPORT_FPU = 2 падает в HardFault при первой же встреченной команде работы с FPU.

Компилятор IAR 7202. В чем может бть проблема?

Share this post


Link to post
Share on other sites

Кто нибудь добился успеха с TN_SUPPORT_FPU?

Прграмма с TN_SUPPORT_FPU > 0 ведёт себя как ревнивая женщина (LPC4088).

Неужели нет альтернативы FreeRTOS?

Share this post


Link to post
Share on other sites

Да, мне нравится она!

Использую в старых проектах.

Перешёл на TNKernel в частности из-за tn_net.

 

 

Share this post


Link to post
Share on other sites

упс... минимальный стек больше при FPU.

Заработало но результат как и у kosyak©:

При TN_SUPPORT_FPU = 0 и TN_SUPPORT_FPU = 1 работает без проблем.

А вот при TN_SUPPORT_FPU = 2 падает в HardFault на инструкции VMOV S0,R0.

R0 = 0x320. Уже день пробился безрезультатно.

Меня собственно устраивает TN_SUPPORT_FPU = 1 :)

 

Не подскажет ли кто как в EWARM заставть компилятор для определённой

функции не делать код для FPU (#pragma например)?

Share this post


Link to post
Share on other sites
Не подскажет ли кто как в EWARM заставть компилятор для определённой

функции не делать код для FPU (#pragma например)?

Попробуйте так.

Выносите функцию в отдельный файл, включаете файл в проект, в опциях указываете компилятору ключ командной строки --core=Cortex-M4

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this