打印
[LKS32 硬件]

LKS32MC081评测+FreeRTOS

[复制链接]
831|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
夜声|  楼主 | 2022-6-30 14:05 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 夜声 于 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------------------------------------ */
实现结果:


使用特权

评论回复
沙发
海滨消消| | 2022-7-7 09:19 | 只看该作者
测评贴讲解详细,感谢分享

使用特权

评论回复
板凳
mmbs| | 2022-7-9 12:19 | 只看该作者
需要修改汇编语言吗   

使用特权

评论回复
地板
tabmone| | 2022-7-9 13:21 | 只看该作者
这个没有用过。   

使用特权

评论回复
5
rosemoore| | 2022-7-9 13:46 | 只看该作者
感觉操作系统一般

使用特权

评论回复
6
pmp| | 2022-7-9 14:14 | 只看该作者
FreeRTOS如何移植?   

使用特权

评论回复
7
iyoum| | 2022-7-9 14:48 | 只看该作者
FreeRTOS占用多大的内存呢  

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

85

帖子

2

粉丝