本帖最后由 夜声 于 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);
- }
- /**
- * [url=home.php?mod=space&uid=247401]@brief[/url] Main program .
- * @param None
- * @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------------------------------------ */
实现结果:
|