本帖最后由 夜声 于 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------------------------------------ */
实现结果:
|