NXP S32K146 FREERTOS工程创建与配置

我用的是S32 Design Studio for ARM Version: 2.2,今天分析一下如何在S32DS环境下创建工程。首先参考图1
在这里添加freertos组件
然后图二

咱不知道咋回事,点这个xtaskcreate不能弹出源码,别的PE配置的都能。问也问不出来查也查不到的╮(╯▽╰)╭。
在这里插入图片描述

先来看看上边这些都是干嘛的:
1.Max. Syscall interrupt priority
configMAX_SYSCALL_INTERRUPT_PRIORITY在FreeRTOSConfig.h中配置,此宏设置好以后,低于此优先级的中断可以安全的调用 FreeRTOS 的 API 函数,高于此优先级的中断FreeRTOS 是不能禁止的,中断服务函数也不能调用 FreeRTOS 的 API 函数!由于高于configMAX_SYSCALL_INTERRUPT_PRIORITY 的优先级不会被 FreeRTOS 内核屏蔽,因此那些对实时性要求严格的任务就可以使用这些优先级,比如四轴飞行器中的壁障检测。(参考正点原子)
2.Tick clock frequency
#define configCPU_CLOCK_HZ ( 48000000UL )
这里选择内部时钟的话最大只能是48Mhz了,在clock manager里面配置时钟时对这个宏有影响。
3.Tick interrupt frequency
#define configTICK_RATE_HZ ( ( TickType_t ) 1000 )
系统时钟节拍1KHz,即1ms。
4.Max.number of task priorities
FreeRTOS中任务的最高优先级是通过FreeRTOSConfig.h文件中的configMAX_PRIORITIES进行配置的,用户实际可以使用的优先级范围是0到configMAX_PRIORITIES – 1。比如我们配置此宏定义为5,那么用户可以使用的优先级号是0,1,2,3,4,不包含5.正点原子例程一般是32.
5.minimal stack size
#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 200 )设置空闲任务的最小任务堆栈大小,以字为单位,不是字节。比如设置为 100的话,那么真正的堆栈大小就是 100*4=400 字节。
6.use 16 bit ticks
#define configUSE_16_BIT_TICKS 0configUSE_16_BIT_TICKS设置系统节拍计数器变量数据类型,系统节拍计数器变量类型为 TickType_t,当configUSE_16_BIT_TICKS 为 1 的时候 TickType_t 就是 16 位的,当configUSE_16_BIT_TICKS为 0 的话TickType_t 就是 32 位的。
7.idle should yield
#define configIDLE_SHOULD_YIELD 1
此宏定义了与空闲任务(idle Task)处于同等优先级的其他用户任务的行为,当为 0 的时候空闲任务不会为其他处于同优先级的任务让出 CPU 使用权。当为 1 的时候空闲任务就会为处于同等优先级的用户任务让出 CPU 使用权。
8.use preemption scheduler
#define configUSE_PREEMPTION 1
为 1 时使用抢占式调度器,为 0 时使用协程。如果使用抢占式调度器的话内核会在每个时钟节拍中断中进行任务切换。
9.Thread Local Stroage Pointers
configNUM_THREAD_LOCAL_STORAGE_POINTERS设置每个任务的本地存储指针数组大小,任务控制块中有本地存储数组指针,用户应用程序可以在这些本地存储中存入一些数据。
10.port optimised task selection
#define configUSE_PORT_OPTIMISED_TASK_SELECTION 1;FreeRTOS有两种方法来选择下一个要运行的任务,一个是通用的方法,另外一个是特殊的方法,也就是硬件方法,使用MCU自带的硬件指令来实现。
11.enable task notifications
#define configUSE_TASK_NOTIFICATIONS 1 为 1 的时候使用任务通知功能,相关的 API 函数会被编译,开启了此功能的话每个任务会多消耗 8 个字节。
12.enable time slicing
configUSE_TIME_SLICING默认情况下,FreeRTOS 使用抢占式调度器,这意味着调度器永远都在执行已经就绪了的最高优先级任务,优先级相同的任务在时钟节拍中断中进行切换,当宏configUSE_TIME_SLICING为 0 的时候不会在时钟节拍中断中执行相同优先级任务的任务切换,默认情况下宏
configUSE_TIME_SLICING 为 1。
13.enable newlib reentrant
configUSE_NEWLIB_REENTRANT(V7.5.0新增)
如果宏configUSE_NEWLIB_REENTRANT设置为1,每一个创建的任务会分配一个newlib(一个嵌入式C库)reent结构。
14.enable backward compatibility
#define configENABLE_BACKWARD_COMPATIBILITY配置为1;使能新版本对老版本的兼容特性,即向后兼容或者说向下兼容。配置为0;禁止此特性。

在这里插入图片描述
关于是否使用协程。
在这里插入图片描述
#define configGENERATE_RUN_TIME_STATS 1 //为1时启用运行时间统计功能
在这里插入图片描述
configUSE_IDLE_HOOK是否定义IDLE空闲任务HOOK函数;配置为0:不定义;配置为1:定义,用户需要实现空闲任务钩子函数。configUSE_IDLE_HOOK是系统设计之初就有的,必须在“FreeRTOSConfig.h”中宏定义。

在这里插入图片描述
#define configSUPPORT_STATIC_ALLOCATION 0
#define configSUPPORT_DYNAMIC_ALLOCATION 1
定义为 1的话在创建 FreeRTOS的内核对象时候 所需要的 RAM就会从 FreeRTOS的堆中 的堆中 动态的获取内存,定义为0的话需要用户自行提供。默认为1。
coalesc blocks选择heap4.c作为内存管理的文件。
在这里插入图片描述
reeRTOS与软件定时器有关的配置选项
#define configUSE_TIMERS 1 //为1时启用软件定时器
#define configTIMER_TASK_PRIORITY (configMAX_PRIORITIES-1) //软件定时器优先级
#define configTIMER_QUEUE_LENGTH 5 //软件定时器队列长度
#define configTIMER_TASK_STACK_DEPTH (configMINIMAL_STACK_SIZE*2) //软件定时器任务堆栈大小
在这里插入图片描述
开启tickless低功耗模式 configUSE_TICKLESS_IDLE
在这里插入图片描述
互斥锁、递归锁、信号量
在这里插入图片描述
#define configQUEUE_REGISTRY_SIZE 8
//不为0时表示启用队列记录,具体的值是可以
//记录的队列和信号量最大数目。
在这里插入图片描述
再就是一些常用的API选择。

实验
创建任务小灯实验

  void vSystemHardwareWorkTask(void *p)
  {
      while(1)
      {
    	  PINS_DRV_TogglePins(PTE,1<<3);
          vTaskDelay(1000);
      }
  }
int main(void)
{
  /* Write your local variable definition here */

  /*** Processor Expert internal initialization. DON'T REMOVE THIS CODE!!! ***/
  #ifdef PEX_RTOS_INIT
    PEX_RTOS_INIT();                   /* Initialization of the selected RTOS. Macro is defined by the RTOS component. */
  #endif
  /*** End of Processor Expert internal initialization.                    ***/
    CLOCK_SYS_Init(g_clockManConfigsArr, CLOCK_MANAGER_CONFIG_CNT,
                              g_clockManCallbacksArr, CLOCK_MANAGER_CALLBACK_CNT);
    CLOCK_SYS_UpdateConfiguration(0U, CLOCK_MANAGER_POLICY_AGREEMENT);

    PINS_DRV_Init(NUM_OF_CONFIGURED_PINS, g_pin_mux_InitConfigArr);
    xTaskCreate( vSystemHardwareWorkTask, "SystemHardwareWorkTask",  310, 0, 1,0);//系统硬件工作任务 优先级1
    vTaskStartScheduler();
  /* Write your code here */
  /* For example: for(;;) { } */

  /*** Don't write any code pass this line, or it will be deleted during code generation. ***/
  /*** RTOS startup code. Macro PEX_RTOS_START is defined by the RTOS component. DON'T MODIFY THIS CODE!!! ***/
  #ifdef PEX_RTOS_START
    PEX_RTOS_START();                  /* Startup of the selected RTOS. Macro is defined by the RTOS component. */
  #endif
  /*** End of RTOS startup code.  ***/
  /*** Processor Expert end of main routine. DON'T MODIFY THIS CODE!!! ***/
  for(;;) {
    if(exit_code != 0) {
      break;
    }
  }
  return exit_code;
  /*** Processor Expert end of main routine. DON'T WRITE CODE BELOW!!! ***/
} /*** End of main routine. DO NOT MODIFY THIS TEXT!!! ***/

实验结果为小灯1s亮灭。
个人感觉目前为止S32DS创建工程做简单任务还是上手比较简单的,后续会把freertos写成一个专题,敬请期待!!!

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>