uC/OSII学习笔记(二)任务的堆栈检验

news2024/12/12 21:49:59

加入OSTaskCreateExt()创建拓展任务函数的使用。
加入OSTaskStkChk()堆栈检验函数的使用。

堆栈检验函数可检查任务堆栈的使用字节数量和空闲字节数量。
具体使用方法如下:
1.创建拓展任务OSTaskCreateExt()用于堆栈检验,堆栈检验必须用拓展任务OSTaskCreateExt()。如,

#define task1_PRIO      50				//这个是任务优先级,任务优先级的编号,1-63,且不能重复,它代表了任务的唯一性
#define task1_STK_NUM   40  			//指任务的OS_STK的数量
OS_STK task1_STK[task1_STK_NUM];		//有task1_STK_NUM 个4个字节的空间,40*4
void task1(void* p_arg); 				//任务函数

#define task2_PRIO      60
#define task2_STK_NUM   40 
OS_STK task2_STK[task2_STK_NUM];
void task2(void* p_arg);

OSTaskCreateExt(task1, NULL, \
                            &task1_STK[task1_STK_NUM - 1], task1_PRIO, task1_PRIO, \
                             task1_STK, task1_STK_NUM, NULL, OS_TASK_OPT_STK_CHK| OS_TASK_OPT_STK_CLR);
OSTaskCreateExt(task2, NULL, \
                            &task2_STK[task2_STK_NUM - 1], task2_PRIO, task2_PRIO, \
                             task2_STK, task2_STK_NUM, NULL, OS_TASK_OPT_STK_CHK| OS_TASK_OPT_STK_CLR);

void task1 (void *p_arg)
{
	INT8U err1 = OSTaskStkChk(task1_PRIO,&StackBytes1);
	GUI_Printf(0,40,GUI_WHITE,GUI_BLACK|GUI_FONT_16,"Task1 FreeStack:%d",StackBytes1.OSFree);
	GUI_Printf(0,60,GUI_WHITE,GUI_BLACK|GUI_FONT_16,"Task1 UsedStack:%d",StackBytes1.OSUsed);
	GUI_Printf(0,80,GUI_WHITE,GUI_BLACK|GUI_FONT_16,"Task1 err:%d",err1);
	while(1)
	{
		GUI_Printf(0,20,GUI_WHITE,GUI_BLACK|GUI_FONT_16,"任务1");
//		GUI_Printf(0,40,GUI_WHITE,GUI_BLACK|GUI_FONT_16,"Task1 FreeStack:%d",StackBytes1.OSFree);
//		GUI_Printf(0,60,GUI_WHITE,GUI_BLACK|GUI_FONT_16,"Task1 UsedStack:%d",StackBytes1.OSUsed);
//		GUI_Printf(0,80,GUI_WHITE,GUI_BLACK|GUI_FONT_16,"Task1 err:%d",err1);
//		OSTimeDlyHMSM(0, 0, 1, 0);
		OSTimeDly(50);
	}
}

void task2(void *p_arg) 
{
	INT8U err2 = OSTaskStkChk(task2_PRIO,&StackBytes2);
	GUI_Printf(0,140,GUI_WHITE,GUI_BLACK|GUI_FONT_16,"Task2 UsedStack:%d",StackBytes2.OSUsed);
	GUI_Printf(0,120,GUI_WHITE,GUI_BLACK|GUI_FONT_16,"Task2 FreeStack:%d",StackBytes2.OSFree);
	GUI_Printf(0,160,GUI_WHITE,GUI_BLACK|GUI_FONT_16,"Task2 err:%d",err2);
	while(1)
	{
		GUI_Printf(0,100,GUI_WHITE,GUI_BLACK|GUI_FONT_16,"任务2");
//		GUI_Printf(0,120,GUI_WHITE,GUI_BLACK|GUI_FONT_16,"Task2 FreeStack:%d",StackBytes2.OSFree);
//		GUI_Printf(0,140,GUI_WHITE,GUI_BLACK|GUI_FONT_16,"Task2 UsedStack:%d",StackBytes2.OSUsed);
//		GUI_Printf(0,160,GUI_WHITE,GUI_BLACK|GUI_FONT_16,"Task2 err:%d",err2);
//		OSTimeDlyHMSM(0, 0, 1, 0);
		OSTimeDly(50);
        // 其他任务...
	}
}

OSTaskCreateExt()创建拓展函数与OSTaskCreate()创建任务函数相比多了五个入口参数,它们的前四个参数task,pdata,ptos和prio(分别为:task是任务代码的指针,pdata是任务开始执行时传递给任务的参数的指针,ptos是分配给任务的堆栈的栈顶指针,prio是分配给任务的优先级)完全相同,先后顺序都一模一样,方便用户将OSTaskCreate()移植到OSTaskCreateExt()。后五个参数分别为:
id参数,为要建立的任务创建一个特殊的标识符,但是只要简单的将id设置的和人物的优先级一样就行。
pbos,是指向任务的堆栈的栈底指针,用于堆栈的检验。
stk_size,用于指定堆栈成员的数目,用于堆栈的检验。
pext,指向用户附加的数据域的指针,用来拓展任务的OS_TCB。
opt,用于设定OSTaskCreateExt()的选项,指定是否允许堆栈检验,是否将堆栈区域清零,任务是否要进行浮点操作等等。ucosii.h文件有一个所有选项的常数表,用户在使用时只需将选项常数进行位或操作即可。在堆栈检验时OSTaskCreateExt()的最后一个参数必须为OS_TASK_OPT_STK_CHK| OS_TASK_OPT_STK_CLR,用于开启堆栈检验。
2.定义结构体OS_STK_DATA XXX用于堆栈检验。如

OS_STK_DATA  StackBytes1;						/*定义结构体,用于堆栈检验*/
OS_STK_DATA  StackBytes2;						/*定义结构体,用于堆栈检验*/

结构体XXX中包含XXX.OSFree和XXX.OSUsed, 分别代表任务堆栈的使用字节数量和空闲字节数量。如

typedef struct os_stk_data {
    INT32U  OSFree;                    /* Number of free entries on the stack                          */
    INT32U  OSUsed;                    /* Number of entries used on the stack                          */
} OS_STK_DATA;

3.调用堆栈检验函数OSTaskStkChk(),两个输入参数分别为待检验任务的优先级和结构体XXX的地址。

void task1 (void *p_arg)
{
	INT8U err1 = OSTaskStkChk(task1_PRIO,&StackBytes1);
	GUI_Printf(0,40,GUI_WHITE,GUI_BLACK|GUI_FONT_16,"Task1 FreeStack:%d",StackBytes1.OSFree);
	GUI_Printf(0,60,GUI_WHITE,GUI_BLACK|GUI_FONT_16,"Task1 UsedStack:%d",StackBytes1.OSUsed);
	GUI_Printf(0,80,GUI_WHITE,GUI_BLACK|GUI_FONT_16,"Task1 err:%d",err1);
	while(1)
	{
		GUI_Printf(0,20,GUI_WHITE,GUI_BLACK|GUI_FONT_16,"任务1");
//		GUI_Printf(0,40,GUI_WHITE,GUI_BLACK|GUI_FONT_16,"Task1 FreeStack:%d",StackBytes1.OSFree);
//		GUI_Printf(0,60,GUI_WHITE,GUI_BLACK|GUI_FONT_16,"Task1 UsedStack:%d",StackBytes1.OSUsed);
//		GUI_Printf(0,80,GUI_WHITE,GUI_BLACK|GUI_FONT_16,"Task1 err:%d",err1);
//		OSTimeDlyHMSM(0, 0, 1, 0);
		OSTimeDly(50);
	}
}

正常运行的堆栈检验函数OSTaskStkChk()的返回值是0,这里用
INT8U err1 = OSTaskStkChk(task1_PRIO,&StackBytes1);
也是为了观察返回值判断是否运行成功。运行结果如图
运行结果
任务1和2均设置了40个OS_STK,使用了34,空闲6。用户应该使自己的应用程序运行足够长的时间,并且经历最坏的堆栈情况,这样才能得到正确的数,为了适应程序的多升级和拓展,应该多分配10%到100%的堆栈空间。

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

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

相关文章

WPF+LibVLC开发播放器-进度条显示和拖动控制

进度条显示和拖动控制 视频教程界面上代码实现进度条显示进度进度条拖动视频进度 效果 视频教程 WPFLibVLC开发播放器-进度条控制 界面上 界面上线增加一个Slider控件&#xff0c;当做播放进度条 <SliderName"PlaySlider"Grid.Row"1"Width"800&qu…

【Rust WebAssembly 入门实操遇到的问题】

Rust WebAssembly 入门实操遇到的问题 什么是WebAssembly跟着教程走wasm-pack build error总结 什么是WebAssembly WebAssembly&#xff08;简称Wasm&#xff09;是一种基于堆栈的虚拟机的二进制指令 格式。Wasm 被设计为编程语言的可移植编译目标&#xff0c;支持在 Web 上部…

同为科技(TOWE)柔性定制化PDU插座

随着科技的进步&#xff0c;越来越多的精密电子设备&#xff0c;成为工作生活密不可分的工具。 电子电气设备的用电环境也变得更为复杂&#xff0c;所以安全稳定的供电是电子电气设备的生命线。 插座插排作为电子电气设备最后十米范围内供配电最终核心部分&#xff0c;便捷、安…

AI RPA 影刀基础教程:开启自动化之旅

RPA 是什么 RPA 就是机器人流程自动化&#xff0c;就是将重复的工作交给机器人来执行。只要是标准化的、重复的、有逻辑行的操作&#xff0c;都可以用 RPA 提效 准备 安装并注册影刀 影刀RPA - 影刀官网 安装 Chrome 浏览器 下载链接&#xff1a;Google Chrome 网络浏览器 …

HTTP 长连接(HTTP Persistent Connection)简介

HTTP长连接怎么看&#xff1f; HTTP 长连接&#xff08;HTTP Persistent Connection&#xff09;简介 HTTP 长连接&#xff08;Persistent Connection&#xff09;是 HTTP/1.1 的一个重要特性&#xff0c;它允许在一个 TCP 连接上发送多个 HTTP 请求和响应&#xff0c;而无需为…

VS与SQL Sever(C语言操作数据库)

作者这里使用的是程序是&#xff1a; Visual Studio SQL Sever (1 对VS的操作 1.首先我们打开Visual Studio Installer&#xff0c;并以管理员身份运行 2.点击修改 3.先选择数据存储和处理&#xff0c;再在右方添加处理工具&#…

基于“开源 2+1 链动 O2O 商城小程序”的门店拉新策略与流程设计

摘要&#xff1a;在数字化商业浪潮席卷之下&#xff0c;实体门店面临着激烈的市场竞争&#xff0c;如何高效拉新成为关乎门店生存与发展的关键问题。本文聚焦于“开源 21 链动 O2O 商城小程序”&#xff0c;深入探讨结合多种手段的门店拉新策略及详细流程设计。通过剖析到店扫码…

微服务即时通讯系统(5)用户管理子服务,网关子服务

用户管理子服务&#xff08;user文件&#xff09; 用户管理子服务也是这个项目中的一个业务最多的子服务&#xff0c;接口多&#xff0c;但是主要涉及的数据表只有user表&#xff0c;Redis的键值对和ES的一个搜索引擎&#xff0c;主要功能是对用户的个人信息进行修改管理&#…

ceph的存储池管理

1 查看存储池信息 查看存储池的名称 [rootceph141ceph]# ceph osd pool ls .mgr查看存储池机器编号 [rootceph141ceph]# ceph osd pool ls 1 .mgr查看存储池的详细信息 [rootceph141ceph]# ceph osd pool ls detail pool 1 .mgr replicated size 3 min_size 2 crush_rule 0 ob…

Spring和SpringBoot的关系和区别?

大家好&#xff0c;我是锋哥。今天分享关于【Spring和SpringBoot的关系和区别&#xff1f;】面试题。希望对大家有帮助&#xff1b; Spring和SpringBoot的关系和区别&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Spring和Spring Boot是两种相关但有所…

21个Python脚本自动执行日常任务(1)

引言 作为编程领域摸爬滚打超过十年的老手&#xff0c;我深刻体会到&#xff0c;自动化那些重复性工作能大大节省我们的时间和精力。 Python以其简洁的语法和功能强大的库支持&#xff0c;成为了编写自动化脚本的首选语言。无论你是专业的程序员&#xff0c;还是希望简化日常工…

蘑菇书(EasyRL)学习笔记(3)

q1、学习与规划 学习&#xff08;learning&#xff09;和规划&#xff08;planning&#xff09;是序列决策的两个基本问题。如下图所示&#xff0c;在强化学习中&#xff0c;环境初始时是未知的&#xff0c;智能体不知道环境如何工作&#xff0c;它通过不断地与环境交互&#x…

46 基于单片机的烧水壶系统设计

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STC89C52RC单片机&#xff0c;采用四个按键&#xff0c;通过DS18B20检测温度&#xff0c;开机显示实时温度 第一个按键为切换功能按键&#xff0c;按下后&#xff0c;可以设置烧水温度的大小&…

谈论 PHP与XSS

本文将讨论一些脚本攻击问题&#xff0c;以及如何解决XSS脚本攻击问题 美好的周末就用来学点知识吧&#xff01;&#xff01;&#xff01; ———————————————————————————————————— 文章目录 XSS跨站脚本攻击XSS是什么XSS类型&#xff1a;反…

用micropython 操作stm32f4单片机的定时器实现蜂鸣器驱动

import pyb import time # 初始化引脚和定时器通道作为PWM输出 # 注意&#xff1a;这里我们假设您使用的是支持PWM的引脚和定时器 # 在不同的MicroPython板上&#xff0c;支持的引脚和定时器可能不同 # 请查阅您的板的文档以确认正确的引脚和定时器 buzzer_pin pyb.Pin(PD15,…

Ubuntu20.04双系统安装详解(内容详细,一文通关!)

Ubuntu20.04作为现今ubuntu非常稳定的一个版本&#xff0c;是大家入门ubnutu的非常奈斯的版本选择。接下来介绍一下在windows上配置ubuntu双系统的方式&#xff0c;该篇博文主要参考b站用户“机器人工匠阿杰”的双系统安装教学视频&#xff0c;传送门如下&#xff1a; &#x…

100V降压恒流芯片SL2516D 内置MOS管 支持15W功率输出 电动车照明

一、SL2516D芯片概述 SL2516D是一款新一代车灯照明专用降压恒流IC&#xff0c;支持高达100V的输入电压范围&#xff0c;并内置了100V功率MOS。它采用ESOP8封装&#xff0c;具有外围电路简单、高效能、高精度和稳定的恒流输出特性。 二、内置MOS管 SL2516D芯片内置了100V功率…

Microi吾码|.NET、VUE快速搭建项目,低代码便捷开发教程

Microi吾码&#xff5c;VUE快速搭建项目&#xff0c;低代码便捷开发教程 一、摘要二、Microi吾码介绍2.1 功能介绍2.2 团队介绍2.3 上线项目案例 三、VUE中使用Microi吾码3.1 前期了解3.2 创建第一个低代码应用3.3 接口API使用说明3.4 引擎界面可视化配置&#xff0c;生成API3.…

线程信号量 Linux环境 C语言实现

既可以解决多个同类共享资源的互斥问题&#xff0c;也可以解决简易的同步问题 头文件&#xff1a;#include <semaphore.h> 类型&#xff1a;sem_t 初始化&#xff1a;int sem_init(sem_t *sem, int pshared, unsigned int value); //程序中第一次对指定信号量调用p、v操…

解决 Maven 部署中的 Artifact 覆盖问题:实战经验分享20241204

&#x1f6e0;️ 解决 Maven 部署中的 Artifact 覆盖问题&#xff1a;实战经验分享 &#x1f4cc; 引言 在软件开发过程中&#xff0c;持续集成和持续部署&#xff08;CI/CD&#xff09;是提高开发效率和代码质量的关键手段。Hudson 和 Maven 是两种广泛使用的工具&#xff0…