Jump to content

    
Sign in to follow this  
dimanisu

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

Recommended Posts

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

Из документации непонятно, можно ли при добавлении 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

упс... минимальный стек больше при 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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this