夜声 发表于 2022-6-30 14:05

LKS32MC081评测+FreeRTOS

本帖最后由 夜声 于 2022-7-1 17:53 编辑

在上一篇文章介绍到LKS32MC081的主频为96MHZ,flash为64k,RAM为8k。很适合用来跑一下实时操作系统,本次以freertos为例实现。由于这个芯片的RAM比较小,所以在freertos实现的过程中要进行裁剪并且进行优化才能使freertos跑起来。
首先准备一个可以用的且有一定外设的工程,本次是在上次OLED显示的工程上进行。下载freertos的源码并将source文件复制到自己的工程文件将下



接下来,删除掉不需要的部分,只需要调整Partable文件夹下的,



只需要留下keil编译环境下的RVDS文件夹与内存管理文件夹

在内存管理文件夹中有几种内存管理算法,选择其中一种即可,剩下的就可以删掉了

在RVDS文件夹下,由于本次使用的是M0内核的单片机,所以只需要保留m0文件夹即可

文件裁剪部分就已经完成了,接下来将freertos源码加入工程中

接下来添加头文件的路径

为了方便使用,可以将FreeRTOSconfig.h添加到左侧的文件目录,具体就在添加.c文件夹那里添加,然后找到FreeRTOSconfig.h的路径,将文件类型换成ALLfile就可以了。

添加成功后如下图所示

添加成功后,即可进行裁剪,功能太多单片机内存不够,在裁剪的过程中还要进行一定的修改,添加#include "lks32mc08x.h",修改configCPU_CLOCK_HZ 为 96000000 HZ,还有就是堆大小部分,这里一定要注意,要改小一点。不然内存不够。

/* Ensure stdint is only used by the compiler, and not the assembler. */
#ifdef __ICCARM__
      #include <stdint.h>
      extern uint32_t SystemCoreClock;
#endif
#include "lks32mc08x.h"

#define configUSE_PREEMPTION                        1
#define configUSE_IDLE_HOOK                              1
#define configUSE_TICK_HOOK                              0
#define configCPU_CLOCK_HZ                              ( 96000000 )
#define configTICK_RATE_HZ                              ( ( TickType_t ) 1000 )
#define configMAX_PRIORITIES                        ( 5 )
#define configMINIMAL_STACK_SIZE                ( ( unsigned short ) 60 )
#define configTOTAL_HEAP_SIZE                        ( ( size_t ) ( 5*1024 ) )
#define configMAX_TASK_NAME_LEN                        ( 5 )
#define configUSE_TRACE_FACILITY                1
#define configUSE_16_BIT_TICKS                        0
#define configIDLE_SHOULD_YIELD                        1
#define configUSE_MUTEXES                              1
#define configQUEUE_REGISTRY_SIZE                8
#define configCHECK_FOR_STACK_OVERFLOW      0
#define configUSE_RECURSIVE_MUTEXES                1
#define configUSE_MALLOC_FAILED_HOOK      0
#define configUSE_APPLICATION_TASK_TAG      0
#define configUSE_COUNTING_SEMAPHORES      1
#define configGENERATE_RUN_TIME_STATS      0

/* Co-routine definitions. */
#define configUSE_CO_ROUTINES                         0
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )

/* Software timer definitions. */
#define configUSE_TIMERS                              0
#define configTIMER_TASK_PRIORITY                ( 2 )
#define configTIMER_QUEUE_LENGTH                5
#define configTIMER_TASK_STACK_DEPTH      ( 80 )

/* Set the following definitions to 1 to include the API function, or zero
to exclude the API function. */
#define INCLUDE_vTaskPrioritySet                1
#define INCLUDE_uxTaskPriorityGet                1
#define INCLUDE_vTaskDelete                              1
#define INCLUDE_vTaskCleanUpResources      1
#define INCLUDE_vTaskSuspend                        1
#define INCLUDE_vTaskDelayUntil                        1
#define INCLUDE_vTaskDelay                              1

/* Normal assert() semantics without relying on the provision of an assert.h
header file. */
#define configASSERT( x ) if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); for( ;; ); }

/* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS
standard names - or at least those used in the unmodified vector table. */
#define vPortSVCHandler SVC_Handler
#define xPortPendSVHandler PendSV_Handler
#define xPortSysTickHandler SysTick_Handler

#endif /* FREERTOS_CONFIG_H */工程配置中勾选usemicroLIB

由于freertos已经接管了时钟异常等,所以需要在interrupt.c中将SysTick_Handler函数屏蔽

在主函数中添加#include "FreeRTOS.h",#include "task.h"头文件,然后创建一个线程用来创建led的闪烁线程和OLED显示的线程,然后删掉。
主函数代码
/*******************************************************************************
* 版权所有 (C)2015, LINKO SEMICONDUCTOR Co.ltd
*
* 文件名称: Main.c
* 文件标识:
* 内容摘要: 工程主代码
* 其它说明: 无
* 当前版本: V 1.0
* 作    者: **
* 完成日期: 2015年11月5日
*
* 修改记录1:
* 修改日期:2021年8月31日
* 版 本 号:V 1.0
* 修 改 人:HMG
* 修改内容:创建
*
*******************************************************************************/
#include "hardware_config.h"
#include "oled.h"
#include "FreeRTOS.h"
#include "task.h"
/*******************************************************************************
函数名称:    int main(void)
功能描述:    主程序入口
输入参数:    无
输出参数:    无
返 回 值:    无
其它说明:   
修改日期      版本号          修改人            修改内容
-----------------------------------------------------------------------------
2021/8/31                     HMG               创建
*******************************************************************************/

//int main(void)
//{

//      Hardware_init();
//      OLED_ShowString(20,0,"oled_test",16);
//      OLED_ShowString(20,30,"21ic&lks32",16);
//    OLED_Refresh();
//      while (1)
//      {

//            led_run();
//               
//      }
//}
//任务堆栈大小
#define LED_TASK_STACK            256
#define OLED_TASK_STACK             256

//任务优先级
#define LED_TASK_PRIORITY            5
#define OLED_TASK_PRIORITY         3




xTaskHandle startTask;
xTaskHandle LEDTask;
xTaskHandle OLEDTask;


portTASK_FUNCTION(vLEDTask, pvParameters)
{
      while(1)
      {
   
                led_run();
                vTaskDelay(100);
      }
}

portTASK_FUNCTION(vOLEDTask, pvParameters)
{      
      while(1)
      {
//                LEDXToggle(LED1);
                OLED_ShowString(20,0,"oled_test",16);
            OLED_ShowString(20,30,"21ic&lks32",16);
      OLED_Refresh();
                vTaskDelay(500);
      }
}


/**********************************************************************************************************
*函 数 名: vStartTask
*功能说明: 系统启动任务,调用各类初始化函数,并创建消息队列和要运行的用户任务
*形    参: 无
*返 回 值: 无
**********************************************************************************************************/
portTASK_FUNCTION(vStartTask, pvParameters)
{
      xTaskCreate(vLEDTask, (char const*)"SensorReadTask",LED_TASK_STACK, NULL, LED_TASK_PRIORITY, &LEDTask);
      xTaskCreate(vOLEDTask, (char const*)"SensorUpdateTask",OLED_TASK_STACK, NULL,OLED_TASK_PRIORITY, &OLEDTask);
      
      //删除本任务
vTaskDelete(NULL);
}
/**
* @briefMain program .
* @paramNone
* @retval None
*/
extern uint8_t P1msReq;
int main(void)
{
      Hardware_init();
      
          //创建启动任务
    xTaskCreate(vStartTask, "startTask", 128, NULL, 0, &startTask);
    //OS调度器启动
    vTaskStartScheduler();
      
      while (1)
      {
//    GPIO_SetBits(GPIO0,GPIO_Pin_6);
//      GPIO_SetBits(GPIO0,GPIO_Pin_7);
//      vTaskDelay(500);
//      GPIO_ResetBits(GPIO0,GPIO_Pin_6);
//      GPIO_ResetBits(GPIO0,GPIO_Pin_7);
      vTaskDelay(500);
      }
}




//空闲钩子函数
void vApplicationIdleHook(void)
{

}


/************************ (C) COPYRIGHT LINKO SEMICONDUCTOR **********************/
/* ------------------------------END OF FILE------------------------------------ */
实现结果:


海滨消消 发表于 2022-7-7 09:19

测评贴讲解详细,感谢分享

mmbs 发表于 2022-7-9 12:19

需要修改汇编语言吗   

tabmone 发表于 2022-7-9 13:21

这个没有用过。   

rosemoore 发表于 2022-7-9 13:46

感觉操作系统一般

pmp 发表于 2022-7-9 14:14

FreeRTOS如何移植?   

iyoum 发表于 2022-7-9 14:48

FreeRTOS占用多大的内存呢
页: [1]
查看完整版本: LKS32MC081评测+FreeRTOS