龙芯+FreeRTOS+LVGL实战笔记(新)——04开启主任务

news2024/9/22 13:31:23

        本专栏是笔者另一个专栏《龙芯+RT-Thread+LVGL实战笔记》的姊妹篇,主要的区别在于实时操作系统的不同,章节的安排和任务的推进保持一致,并对源码做了改进和优化,各位可以先到本人主页下去浏览另一专栏的博客列表(目前已撰写36篇,图1所示),再决定是否订阅。此外,也可以前往本人在B站的视频合集(图2所示)观看所有演示视频,合集首个视频链接为:

图1 《龙芯+RT-Thread+LVGL实战笔记》专栏所有文章
图2 笔者在B站上的龙芯视频合集

        此外,关于专栏的收费,无非就是笔者想增加一些创作的动力。由于上个专栏受到了厂家关注并请求本人下架,但是已收费的资源不可下架,所以只能无奈的上调了价格(涨价了就无法降价)。而本专栏笔者不再顾忌,将维持该定价,希望朋友们理解和支持。  


        上一篇我们完成了最基本的移植工作,接下来就可以此基础上规划任务了,首当其冲的就是一个优先级最高的主任务,这个主任务能够保证整个系统最基本的运作。

一、工程文件和任务框架

        开撸代码之前,这里先根据样题的编排(图3所示),把工程文件和任务的整体脉络梳理在图4中。当然,这只是本人的规划思路,并不一定是最合理的,供各位借鉴和参考。后续的版本和代码都将依据图4的规划来推进。

图3 部分样题展示
图4 工程文件和任务的框架

二、准备工程和文件

        如图5所示,我们把上一次的整个工程复制另存一份,作为1.0的版本,并在 src 目录下新建两个文件:task_top.ctask_top.h。当然,别忘了把 .c 文件加入到工程中(.h文件可加可不加),如图6所示。

图5 准备新工程和新文件
图6 把 .c 文件加入到工程

三、编写源码

3.1 程序运行流程

        阅读源码之前,先说明一下程序运行的基本流程,请大家对照着图7来看:

  1. 首先,是一些列的初始化,包括 BSP 驱动、新增的硬件初始化以及 LVGL 初始化。
  2. 接着,就可以按照 FreeRTOS 常用的启动流程,来创建一个启动任务 start_task,即图中黄色背景部分,紧跟着就开始任务调度,随后的所有工作就可以交给 FreeRTOS 了。
  3. 然后,start_task 的使命是创建最核心的主任务 top_task,即图中蓝色背景部分,创建成功便全身而退。
  4. 最后,在 top_task 任务里,运行 LVGL 的任务处理器,保证最基本的系统响应。

        基于上述流程,下面的源码将按照 main.c、task_top.h 和 task_top.c 这三个文件的顺序来解读。

图7 程序运行流程图

3.2 main.c 文件源码

        该文件的源码如代码清单1所示,直接看 main() 函数,一上来就执行几个必要的初始化:

  1. BSP 的初始化 ls1x_drv_init(),该函数会将工程下 ls1x-drv 目录下涉及到的板载硬件进行初始化。
  2. 第三方库的初始化 install_3th_libraries(),LVGL 的初始化就在该函数中。
  3. 我们自己编写的硬件初始化 Hardware_Init(),只不过这个函数暂时为空,后面会根据需要陆续往里添加。
  4. 接下来,执行 freertos_start() 函数,该函数的定义在 task_top.c 文件中,源码见下面的3.4小节。
/****************************************************************************
 * 代码清单1:main.c
 *
 * 项目名称:龙芯1B200 + FreeRTOS + LVGL7
 *
 * 项目描述:嵌入式系统应用开发赛项第一模块样题任务
 *
 * 项目日期:2024/08/17
 *
 * 作    者:老耿
 *
 * 版本说明:1.移植了FreeRTOS系统和LVGL7.0.1组件
 *           2.添加了优先级最高的主任务top_task,并部署了一个开关来测试LVGL
 ***************************************************************************/

//---------------------------------------------------------------------------
// 必要的库头文件、BSP头文件、src头文件
//---------------------------------------------------------------------------
#include "mips.h"
#include <time.h>
#include "bsp.h"
#include "task_top.h"

#if defined(BSP_USE_FB)
  #include "ls1x_fb.h"
  #ifdef XPT2046_DRV
    char LCD_display_mode[] = LCD_800x480;
  #elif defined(GT1151_DRV)
    char LCD_display_mode[] = LCD_800x480;
  #else
    #error "在bsp.h中选择配置 XPT2046_DRV 或者 GT1151_DRV"
           "XPT2046_DRV:  用于800*480 横屏的触摸屏."
           "GT1151_DRV:   用于480*800 竖屏的触摸屏."
           "如果都不选择, 注释掉本 error 信息, 然后自定义: LCD_display_mode[]"
  #endif
#endif


/*---------------------------------------------------------------------------
 * 函数名称:Hardware_Init
 * 功    能:硬件初始化
 * 入口参数:无
 * 返 回 值:无
 * 说明描述:把所有硬件的初始化都集中在这个函数里
 *-------------------------------------------------------------------------*/
void Hardware_Init(void)
{
    //暂无,后续将硬件的初始化都写在本函数中
}

/*--------------------------------------------------------------------------
 * 函数名称:main
 * 功    能:主函数
 * 入口参数:主函数入口参数格式
 * 返 回 值:
 * 说明描述:把硬件和LVGL初始化以后,剩下的就交给FreeRTOS了
 *-------------------------------------------------------------------------*/
int main(int argc, char** argv)
{
	printk("\r\nLS1B200 + FreeRTOS + LVGL7\r\n");

    ls1x_drv_init();            /* BSP驱动初始化 */
    install_3th_libraries(); 	/* 第三方库初始化,包括LVGL */
    Hardware_Init();            /* 硬件初始化 */
    
    freertos_start();           /* 启动任务,开启调度 */

    return 0;
}

3.3 task_top.h 文件源码

        该头文件的源码如代码清单2所示,按照笔者的规划,任务堆栈的大小以128(单位:字)为基数,任务优先级最高不超过8。因此,这两个参数以宏的形式进行了定义。另外,就是声明了一下上面提到 freertos_start() 函数。

//---------------------------------------------------------
// 代码清单2:task_top.h
//---------------------------------------------------------

#ifndef _TASK_TOP_H
#define _TASK_TOP_H

//---------------------------------------------------------
// 必要的宏定义
//---------------------------------------------------------
#define  STACK_SIZE    128      //任务堆栈大小(基数)
#define  MAX_PRIO      8        //任务最高优先级(暂定为8)

//---------------------------------------------------------
// 函数声明
//---------------------------------------------------------
void freertos_start(void);

#endif

3.4 task_top.c 文件源码

        该文件的源码如代码清单3所示,大家可以对照上面的流程图和注释来阅读。freertos_start() 函数一旦执行,便启动了 start_task 任务,同时开启了 FreeRTOS 的任务调度,而 start_task 里又创建了优先级最高的 top_task 任务,在该任务中,部署了一个用于测试的开关组件,随后就保持着 LVGL 运行。

/*************************************************************
 * 代码清单3:task_top.c
 *
 * 文件描述:主任务和主界面
 *
 * 作    者:老耿
 *
 * 版    本:V1.0 @ 2024/08/17
 ***********************************************************/

//-----------------------------------------------------------
// 必要的库头文件、LVGL头文件、BSP头文件、src头文件
//-----------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include "FreeRTOS.h"
#include "task.h"

#include "lvgl.h"
#include "lv_port_disp.h"
#include "lv_port_indev.h"

#include "bsp.h"

#include "task_top.h"

//-----------------------------------------------------------------
// 相关的任务句柄和任务函数
//-----------------------------------------------------------------
static TaskHandle_t StartTask_Handler;          //启动任务句柄
static void start_task(void *pvParameters);     //启动任务函数

static TaskHandle_t TopTask_Handler;            //主任务句柄
static void top_task(void *pvParameters);       //主任务函数

/*----------------------------------------------------------------
 * 函数名称:start_task
 * 功    能:启动任务
 * 入口参数:*pvParameters --- 传入参数(未用到)
 * 返 回 值:无
 * 说明描述:创建主任务即可
 *---------------------------------------------------------------*/
static void start_task(void *pvParameters)
{
	taskENTER_CRITICAL();				//进入临界区

    //创建主界面任务
    xTaskCreate((TaskFunction_t )top_task,			//任务函数
                (const char*    )"top_task",		//任务名称
                (uint16_t       )STACK_SIZE,	    //任务堆栈大小
                (void*          )NULL,				//传给任务函数的参数
                (UBaseType_t    )MAX_PRIO,		    //任务优先级(最高)
                (TaskHandle_t*  )&TopTask_Handler);	//任务句柄

	vTaskDelete(StartTask_Handler);		//删除开始任务
    taskEXIT_CRITICAL();				//退出临界区
}

/*------------------------------------------------------------------
 * 函数名称:top_task
 * 功    能:生成主界面的任务
 * 入口参数:*pvParameters --- 传入参数(未用到)
 * 返 回 值:无
 * 说明描述:要处理LVGL任务,需要定期在OS任务中调用lv_task_handler()
 *-----------------------------------------------------------------*/
static void top_task(void *pvParameters)
{
    //在屏幕中央部署一个开关,测试LVGL的运行
    lv_obj_t *sw = lv_switch_create(lv_scr_act(), NULL);
    lv_obj_set_width(sw, 80);
    lv_obj_set_height(sw, 50);
    lv_obj_align(sw, NULL, LV_ALIGN_CENTER, 0, 0);

    while(1)
    {
        lv_task_handler();      //在主线程中定期调用LVGL任务处理器
        vTaskDelay(5);          //计时并不严格,大约5ms以保持系统响应
    }
}

/*----------------------------------------------------------------
 * 函数名称:freertos_start
 * 功    能:FreeRTOS入口函数
 * 入口参数:无
 * 返 回 值:无
 * 说明描述:在该函数里创建启动任务,并开启任务调度
 *---------------------------------------------------------------*/
void freertos_start(void)
{
    xTaskCreate((TaskFunction_t )start_task,			//任务函数
                (const char*    )"start_task",          //任务名称
                (uint16_t       )STACK_SIZE,		    //任务堆栈大小
                (void*          )NULL,                  //传入给任务函数的参数
                (UBaseType_t    )MAX_PRIO-7,            //任务优先级(最低)
                (TaskHandle_t*  )&StartTask_Handler);   //任务句柄

    vTaskStartScheduler();      //开启任务调度
}

四、程序运行与测试

        编译没错的话就可以运行或下载本程序了,具体效果见下面的演示视频。至此,FreeRTOS 和 LVGL 都能够正常运行了,后续我们将结合更丰满的图形化组件,去创建下面的子任务,实现样题的一个个要求。

新版的《龙芯+FreeRTOS+LVGL实战》系列启动了,从搞定移植开始

(本文完)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2107995.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于OGC300工业级LORA网关与OM201L数传终端的化工厂人员定位系统解决方案

化工行业作为高风险的行业之一&#xff0c;其安全管理一直备受关注。化工生产过程中涉及到各种危险品和复杂的工艺&#xff0c;一旦发生事故&#xff0c;往往会造成严重的人员伤亡和财产损失。因此&#xff0c;化工企业急需一套可靠的安全管理系统来监测安全隐患、预防事故发生…

【2024数模国赛赛题思路公开】国赛A题思路丨附可运行代码丨无偿自提

2024年国赛A题解题思路 【题目分析】 问题1&#xff1a;舞龙队沿螺距为55 cm的等距螺线顺时针盘入&#xff0c;给出300秒内舞龙队每秒的位置和速度 分析思路&#xff1a; 螺线方程&#xff1a; 需要建立螺线方程&#xff0c;以便描述龙头及每节板凳的位置。螺线是基于极坐标系…

图形几何算法 -- 凸包算法

前言 常用凸包算法包括Graham Scan 算法和Jarvis March (Gift Wrapping) 算法&#xff0c;在这里要简单介绍的是Graham Scan 算法。 1、概念 凸包是一个点集所包围的最小的凸多边形。可以想象用一根绳子围绕着一群钉子&#xff0c;绳子所形成的轮廓便是这些钉子的凸包。在计算…

谈谈AI领域的认知误区、机会点与面临的挑战

谈谈AI领域的认知误区、机会点与面临的挑战 最近2年&#xff0c;AI 技术的火爆&#xff0c;到处都能看到大家在讨论AI 的发展与机会。这里我们讨论一下AI 认知的误区&#xff0c;机会点和面临的挑战。 by kimmking AI 认知的误区 这年头掀起了所有人讨论AI热潮的同时&#xf…

使用C语言实现字符推箱子游戏

使用C语言实现字符推箱子游戏 推箱子&#xff08;Sokoban&#xff09;是一款经典的益智游戏&#xff0c;玩家通过移动角色将箱子推到目标位置。本文将带你一步步用C语言实现一个简单的字符版本的推箱子游戏。 游戏规则 玩家只能推箱子&#xff0c;不能拉箱子。只能将箱子推到…

【内容审核】对审核结果进行封装

目录 1、分析返回结果示例 2、自定义封装类 在【内容审核】Java实现七牛云内容审核功能七牛 java 审核-CSDN博客 中实现了文本、图片和视频的审核功能&#xff0c;但是这些功能灵活性不够&#xff0c;既不能自己设置审核的强度&#xff0c;也不能内容违规的详细信息&#xff…

【教学类-52-08】20240905动物数独(6宫格)一页2张任务卡,一页一个动物贴图卡,有答案

背景需求&#xff1a; 前文提到6宫格数独的图片6*636图&#xff0c;如果将6张任务卡放在一个A4上&#xff0c;看上去6种动物很小&#xff0c;所以我换了一个word模板&#xff0c;变成了2张任务卡放在一个A4上。 【教学类-52-07】20240903动物数独&#xff08;6宫格&#xff0…

dp练习【4】

最长数对链 646. 最长数对链 给你一个由 n 个数对组成的数对数组 pairs &#xff0c;其中 pairs[i] [lefti, righti] 且 lefti < righti 。 现在&#xff0c;我们定义一种 跟随 关系&#xff0c;当且仅当 b < c 时&#xff0c;数对 p2 [c, d] 才可以跟在 p1 [a, b…

003: Visual Studio 配置 VTK 开发环境的方法与比较

目录 简介&#xff1a; 1 配置属性方法&#xff1a; 2 创建配置文件 3 在新项目中导入props文件 总结&#xff1a; 简介&#xff1a; 编译好VTK后&#xff0c;在安装目录里面有通常有包含bin,lib和include等文件夹&#xff0c;要在自己的项目里面使用VTK&#xff0c;主要…

如何用c++判断一个类型是vector

如何用c判断一个类型是vector 我们使用模板元编程来搞定 这里我们可以定义一个模板结构体 is_std_vector&#xff0c;并对其进行特化&#xff0c;以便专门处理 std::vector 类型。 . 下面是详细的实现和使用示例。 实现 is_std_vector 类型, 继承自false_type 首先&#xff…

Unexpected token d in JSON at position 5, check bodyParser config错误解决

错误原因&#xff1a;json格式不对 { desc"设备1", iotProjectId11 } 解决&#xff1a;通过json在线校验格式校验json格式&#xff0c;找出错误原因&#xff0c;修改 在线JSON校验格式化工具&#xff08;Be JSON&#xff09; 修改&#xff1a; {"desc": &…

基于SpringBoot的校园博客系统

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot框架 工具&#xff1a;IDEA/Eclipse、Navicat、Maven、Tomcat 系统展示 首页 博主管理…

使用 MongoDB 构建 AI:Patronus 如何自动进行大语言模型评估来增强对生成式 AI 的信心

大语言模型可能不可靠&#xff0c;这几乎算不上头条新闻。对于某些用例&#xff0c;这可能会带来不便。而对于其他行业&#xff0c;尤其是受监管行业&#xff0c;后果则要严重得多。于是&#xff0c;业内首个大语言模型自动评估平台 Patronus AI 应运而生。 Patronus AI 由 Met…

为啥给的贷款额度差距那么大?机构到底是怎么决定给你多少额度?

今日&#xff0c;我们深入探讨一个颇为引人入胜的话题——为何在不同银行或信贷机构申请贷款时&#xff0c;所能获得的额度竟能如此大相径庭&#xff1f;同时&#xff0c;揭秘这些金融机构背后是如何精密计算并决定每位申请者的“额度”的。以下内容干货满满&#xff0c;建议收…

10 先序遍历创建二叉树

这个代码是使用手动输入的方式创建二叉树 比较直观 #include "stdio.h" #include "stdlib.h"typedef int ElemType; typedef struct node {ElemType data;struct node *lchild;struct node *rchild; } Node;Node *create_node(int value) {Node *node (N…

2024国赛数学建模B题思路模型

完整的思路模型请查看文末名片

2024 年高教社杯全国大学生数学建模竞赛题目【A/B/C/D/E题】完整思路

↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ A题是数模类赛事很常见的物理类赛题&#xff0c;需要学习不少相关知识。此题涉及对一个动态系统的建模&#xff0c;模拟…

弹框用户勾选过得置灰 或者不显示

弹框用户勾选过得置灰 或者不显示 添加 :disabled“row.disabled” <el-table-column label"名称" width"300"><template #default"{ row }"><el-radio:disabled"row.disabled":label"row.coursesName"v-mo…

中秋节如何利用Python发送彩信

中秋节&#xff0c;作为中国传统节日之一&#xff0c;不仅是家人团聚的时刻&#xff0c;也是商家提高销售业绩的黄金时期。在这个充满温情与消费氛围的节日里&#xff0c;合理利用短信平台进行精准营销&#xff0c;可以显著提高企业的销售业绩。 支持免费对接试用乐讯通PaaS平台…

【全网最全】2024年数学建模国赛B题保奖思路+成品论文+matlab/python代码等(后续会更新

您的点赞收藏是我继续更新的最大动力&#xff01; 一定要点击末文的卡片&#xff0c;那是获取资料的入口&#xff01; 一、问题重述 本题聚焦于某电子产品制造企业在生产过程中的决策问题。企业在生产中需采购 和使用两种关键零配件&#xff0c;并在装配过程中面临如何优化质…