[LKS32 硬件] LKS32MC081评测+FreeRTOS

[复制链接]
 楼主| 夜声 发表于 2022-6-30 14:05 | 显示全部楼层 |阅读模式
本帖最后由 夜声 于 2022-7-1 17:53 编辑

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

添加到自己的工程.jpg
接下来,删除掉不需要的部分,只需要调整Partable文件夹下的,

sorce文件夹下的内容.jpg

只需要留下keil编译环境下的RVDS文件夹与内存管理文件夹
内存管理与keil.jpg
在内存管理文件夹中有几种内存管理算法,选择其中一种即可,剩下的就可以删掉了
保留heap4.jpg
在RVDS文件夹下,由于本次使用的是M0内核的单片机,所以只需要保留m0文件夹即可
RVDS保留m0.jpg
文件裁剪部分就已经完成了,接下来将freertos源码加入工程中
添加.c文件.jpg
接下来添加头文件的路径
头文件路径.jpg
为了方便使用,可以将FreeRTOSconfig.h添加到左侧的文件目录,具体就在添加.c文件夹那里添加,然后找到FreeRTOSconfig.h的路径,将文件类型换成ALLfile就可以了。
添加config文件.jpg
添加成功后如下图所示
添加文件成功.jpg
添加成功后,即可进行裁剪,功能太多单片机内存不够,在裁剪的过程中还要进行一定的修改,添加#include "lks32mc08x.h",修改configCPU_CLOCK_HZ 为 96000000 HZ,还有就是堆大小部分,这里一定要注意,要改小一点。不然内存不够。

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

  7. #define configUSE_PREEMPTION                        1
  8. #define configUSE_IDLE_HOOK                                1
  9. #define configUSE_TICK_HOOK                                0
  10. #define configCPU_CLOCK_HZ                                ( 96000000 )
  11. #define configTICK_RATE_HZ                                ( ( TickType_t ) 1000 )
  12. #define configMAX_PRIORITIES                        ( 5 )
  13. #define configMINIMAL_STACK_SIZE                ( ( unsigned short ) 60 )
  14. #define configTOTAL_HEAP_SIZE                        ( ( size_t ) ( 5*1024 ) )
  15. #define configMAX_TASK_NAME_LEN                        ( 5 )
  16. #define configUSE_TRACE_FACILITY                1
  17. #define configUSE_16_BIT_TICKS                        0
  18. #define configIDLE_SHOULD_YIELD                        1
  19. #define configUSE_MUTEXES                                1
  20. #define configQUEUE_REGISTRY_SIZE                8
  21. #define configCHECK_FOR_STACK_OVERFLOW        0
  22. #define configUSE_RECURSIVE_MUTEXES                1
  23. #define configUSE_MALLOC_FAILED_HOOK        0
  24. #define configUSE_APPLICATION_TASK_TAG        0
  25. #define configUSE_COUNTING_SEMAPHORES        1
  26. #define configGENERATE_RUN_TIME_STATS        0

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

  30. /* Software timer definitions. */
  31. #define configUSE_TIMERS                                0
  32. #define configTIMER_TASK_PRIORITY                ( 2 )
  33. #define configTIMER_QUEUE_LENGTH                5
  34. #define configTIMER_TASK_STACK_DEPTH        ( 80 )

  35. /* Set the following definitions to 1 to include the API function, or zero
  36. to exclude the API function. */
  37. #define INCLUDE_vTaskPrioritySet                1
  38. #define INCLUDE_uxTaskPriorityGet                1
  39. #define INCLUDE_vTaskDelete                                1
  40. #define INCLUDE_vTaskCleanUpResources        1
  41. #define INCLUDE_vTaskSuspend                        1
  42. #define INCLUDE_vTaskDelayUntil                        1
  43. #define INCLUDE_vTaskDelay                                1

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

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

  52. #endif /* FREERTOS_CONFIG_H */
工程配置中勾选usemicroLIB
添加微库.jpg
由于freertos已经接管了时钟异常等,所以需要在interrupt.c中将SysTick_Handler函数屏蔽
屏蔽时钟异常.jpg
在主函数中添加#include "FreeRTOS.h",#include "task.h"头文件,然后创建一个线程用来创建led的闪烁线程和OLED显示的线程,然后删掉。
主函数代码
  1. /*******************************************************************************
  2. * 版权所有 (C)2015, LINKO SEMICONDUCTOR Co.ltd
  3. *
  4. * 文件名称: Main.c
  5. * 文件标识:
  6. * 内容摘要: 工程主代码
  7. * 其它说明: 无
  8. * 当前版本: V 1.0
  9. * 作    者: **
  10. * 完成日期: 2015年11月5日
  11. *
  12. * 修改记录1:
  13. * 修改日期:2021年8月31日
  14. * 版 本 号:V 1.0
  15. * 修 改 人:HMG
  16. * 修改内容:创建
  17. *
  18. *******************************************************************************/
  19. #include "hardware_config.h"
  20. #include "oled.h"
  21. #include "FreeRTOS.h"
  22. #include "task.h"
  23. /*******************************************************************************
  24. 函数名称:    int main(void)
  25. 功能描述:    主程序入口
  26. 输入参数:    无
  27. 输出参数:    无
  28. 返 回 值:    无
  29. 其它说明:   
  30. 修改日期      版本号          修改人            修改内容
  31. -----------------------------------------------------------------------------
  32. 2021/8/31                     HMG               创建
  33. *******************************************************************************/

  34. //int main(void)
  35. //{

  36. //        Hardware_init();
  37. //        OLED_ShowString(20,0,"oled_test",16);
  38. //        OLED_ShowString(20,30,"21ic&lks32",16);
  39. //    OLED_Refresh();
  40. //        while (1)
  41. //        {

  42. //            led_run();
  43. //               
  44. //        }
  45. //}
  46. //任务堆栈大小
  47. #define LED_TASK_STACK              256
  48. #define OLED_TASK_STACK             256

  49. //任务优先级
  50. #define LED_TASK_PRIORITY            5
  51. #define OLED_TASK_PRIORITY           3




  52. xTaskHandle startTask;
  53. xTaskHandle LEDTask;
  54. xTaskHandle OLEDTask;


  55. portTASK_FUNCTION(vLEDTask, pvParameters)
  56. {
  57.         while(1)
  58.         {
  59.      
  60.                 led_run();
  61.                 vTaskDelay(100);
  62.         }
  63. }

  64. portTASK_FUNCTION(vOLEDTask, pvParameters)
  65. {        
  66.         while(1)
  67.         {
  68. //                LEDXToggle(LED1);
  69.                 OLED_ShowString(20,0,"oled_test",16);
  70.             OLED_ShowString(20,30,"21ic&lks32",16);
  71.         OLED_Refresh();
  72.                 vTaskDelay(500);
  73.         }
  74. }


  75. /**********************************************************************************************************
  76. *函 数 名: vStartTask
  77. *功能说明: 系统启动任务,调用各类初始化函数,并创建消息队列和要运行的用户任务
  78. *形    参: 无
  79. *返 回 值: 无
  80. **********************************************************************************************************/
  81. portTASK_FUNCTION(vStartTask, pvParameters)
  82. {
  83.         xTaskCreate(vLEDTask, (char const*)"SensorReadTask",LED_TASK_STACK, NULL, LED_TASK_PRIORITY, &LEDTask);
  84.         xTaskCreate(vOLEDTask, (char const*)"SensorUpdateTask",OLED_TASK_STACK, NULL,OLED_TASK_PRIORITY, &OLEDTask);
  85.         
  86.         //删除本任务
  87.   vTaskDelete(NULL);
  88. }
  89. /**
  90.   * [url=home.php?mod=space&uid=247401]@brief[/url]  Main program .
  91.   * @param  None
  92.   * @retval None
  93.   */
  94. extern uint8_t P1msReq;
  95. int main(void)
  96. {
  97.         Hardware_init();
  98.         
  99.           //创建启动任务
  100.     xTaskCreate(vStartTask, "startTask", 128, NULL, 0, &startTask);
  101.     //OS调度器启动
  102.     vTaskStartScheduler();
  103.         
  104.         while (1)
  105.         {
  106. //    GPIO_SetBits(GPIO0,GPIO_Pin_6);
  107. //        GPIO_SetBits(GPIO0,GPIO_Pin_7);
  108. //        vTaskDelay(500);
  109. //        GPIO_ResetBits(GPIO0,GPIO_Pin_6);
  110. //        GPIO_ResetBits(GPIO0,GPIO_Pin_7);
  111.         vTaskDelay(500);
  112.         }
  113. }




  114. //空闲钩子函数
  115. void vApplicationIdleHook(void)
  116. {

  117. }


  118. /************************ (C) COPYRIGHT LINKO SEMICONDUCTOR **********************/
  119. /* ------------------------------END OF FILE------------------------------------ */
实现结果:
tutieshi_640x288_7s.gif

海滨消消 发表于 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占用多大的内存呢  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

89

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部