RTX RTOS 操作实例分析之---线程(thread)

news2024/11/18 4:17:10

0 Preface/Foreword

1 线程(thread)

1.1 线程定义

1.1.1 USE_BASIC_THREADS(宏定义)

经过以上步骤(makefile包含),USE_BASIC_THREADS在编译阶段被定义到相应的模块中。

1.1.2 定义线程ID变量 

osThreadId app_thread_tid;

1.1.3 线程入口函数(entry point)

 static void app_thread(void const *argument);

static void app_thread(void const *argument)
{
    while(1){
        app_mailbox_get();
    }
}

1.1.4 定义线程结构体变量 (osThreadDef)

 osThreadDef含有5个参数

  • name,线程入口地址,即线程函数入口
  • priority,线程的优先级
  • instances,该参数,在宏展开时没有实际作用。(一般使用时改值设置为1,为什么呢?
  • stacksz,线程堆栈大小
  • task_name,其实就是线程入口地址名字的字符串

注意,thread堆栈的大小由makefile文件控制,thread堆栈的地址为一个数组首地址(转换很有意思,可以参考cmsis_os.h文件),该数组的类似是unit64

 osThreadDef(app_thread, osPriorityAboveNormal, 1, APP_THREAD_STACK_SIZE, "app_thread");

APP_THREAD_STACK_SIZE的值为:1024 * 2 

根据以下设置可知APP_THREAD_STACK_SIZE的值。

1.2 创建线程对象(object) 

 app_thread_tid = osThreadCreate(osThread(app_thread), NULL);

osThreadCreate:该函数的接口在cmsis_os1.c中定义(为了满足向后兼容性),定义中最终调用的函数还是: osThreadNew(具体实现在库中)

// Thread
osThreadId osThreadCreate (const osThreadDef_t *thread_def, void *argument) {

  if (thread_def == NULL) {
    return (osThreadId)NULL;
  }
  return osThreadNew((osThreadFunc_t)thread_def->pthread, argument, &thread_def->attr);
}

/// Create a thread and add it to Active Threads.
osThreadId_t osThreadNew (osThreadFunc_t func, void *argument, const osThreadAttr_t *attr) {
  osThreadId_t thread_id;

  EvrRtxThreadNew(func, argument, attr);
  if (IsIrqMode() || IsIrqMasked()) {
    EvrRtxThreadError(NULL, (int32_t)osErrorISR);
    thread_id = NULL;
  } else {
    thread_id = __svcThreadNew(func, argument, attr);
  }
  return thread_id;
}

1.3 线程运行 

static void app_thread(void const *argument)
{
    while(1){
        app_mailbox_get();
    }
}

int app_mailbox_get(void)
{
    osEvent evt;
    while(1){
        evt = osMailGet(app_mailbox, millisec);
        if (evt.status == osEventMail) {
            millisec = 0;
            APP_MESSAGE_BLOCK* msg_p = NULL;
            if(((APP_MESSAGE_BLOCK *)evt.value.p)->mod_level == APP_MOD_LEVEL_0) {
                msg_p = (APP_MESSAGE_BLOCK*)osMailAlloc(app_mailbox_level0, 0);
                ASSERT(msg_p, "osMailAlloc error0 %p",msg_p);
                memcpy((uint8_t*)msg_p,(uint8_t*)evt.value.p,sizeof(APP_MESSAGE_BLOCK));
                osMailPut(app_mailbox_level0, msg_p);
            }else if(((APP_MESSAGE_BLOCK *)evt.value.p)->mod_level == APP_MOD_LEVEL_1) {
                msg_p = (APP_MESSAGE_BLOCK*)osMailAlloc(app_mailbox_level1, 0);
                ASSERT(msg_p, "osMailAlloc error1 %p",msg_p);
                memcpy((uint8_t*)msg_p,(uint8_t*)evt.value.p,sizeof(APP_MESSAGE_BLOCK));
                osMailPut(app_mailbox_level1, msg_p);
            }else {
                msg_p = (APP_MESSAGE_BLOCK*)osMailAlloc(app_mailbox_level2, 0);
                ASSERT(msg_p, "osMailAlloc error2 %p",msg_p);
                memcpy((uint8_t*)msg_p,(uint8_t*)evt.value.p,sizeof(APP_MESSAGE_BLOCK));
                osMailPut(app_mailbox_level2, msg_p);
            }
            osMailFree(app_mailbox, (APP_MESSAGE_BLOCK *)evt.value.p);
        }else{
            break;
        }
    }

    evt = osMailGet(app_mailbox_level0, 0);
    if (evt.status == osEventMail) {
        app_mailbox_process((APP_MESSAGE_BLOCK *)evt.value.p);
        osMailFree(app_mailbox_level0, (APP_MESSAGE_BLOCK *)evt.value.p);
        return 0;
    }

    evt = osMailGet(app_mailbox_level1, 0);
    if (evt.status == osEventMail) {
        app_mailbox_process((APP_MESSAGE_BLOCK *)evt.value.p);
        osMailFree(app_mailbox_level1, (APP_MESSAGE_BLOCK *)evt.value.p);
        return 0;
    }

    evt = osMailGet(app_mailbox_level2, 0);
    if (evt.status == osEventMail) {
        app_mailbox_process((APP_MESSAGE_BLOCK *)evt.value.p);
        osMailFree(app_mailbox_level2, (APP_MESSAGE_BLOCK *)evt.value.p);
        return 0;
    }
    millisec = osWaitForever;
    return -1;
}

 

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

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

相关文章

博客部署004-centos安装mysql及redis

1、如何查看当前centos版本? cat /etc/os-release 2、安装mysql 我的是centos8版本,使用dnf命令 2.1 CentOS 7/8: sudo yum install -y mysql-community-server 或者在CentOS 8上,使用DNF:🌟 sudo dnf install -y mysql-ser…

无尽加班何时休--状态模式

1.1 加班,又是加班! 公司的项目很急,所以要求加班。经理把每个人每天的工作都排得满满的,说做完就可以回家,但是没有任何一个人可以在下班前完成的,基本都得加班,这就等于是自愿加班。我走时还有…

[技术闲聊]我对电路设计的理解(七)-Cadence原理图绘制

一、原理图软件推荐 之前的章节有讲过AD、PADS、Cadence,以及三者的应用标准,今天再讲讲这一点。 如果是学生,可以学习AD软件,因为学校在学习,上手容易,而且即使工作后,如果是电机控制等4层板或…

数据劫持的冲突问题

在近段时间我又再一次使用了数据劫持,发现了一些冲突问题,并在此介绍我所应用的场景。 一、冲突问题 在之前的文章中有介绍过数据劫持,但后来使用的很少,最近在一次使用的过程中,发现了一些问题。 1.value属性的冲突…

第十四届蓝桥杯省赛大学C组(C/C++)填充

原题链接:填充 有一个长度为 n 的 01 串,其中有一些位置标记为 ?,这些位置上可以任意填充 0 或者 1,请问如何填充这些位置使得这个 01 串中出现互不重叠的 0 和 1 子串最多,输出子串个数。 输入格式 输入一行包含一…

【51单片机学习记录】超声波测距

一、超声波测距概述 (1)超声波时间差测距原理 超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。超声…

环形链表 - LeetCode 热题 25

大家好!我是曾续缘🥰 今天是《LeetCode 热题 100》系列 发车第 25 天 链表第 4 题 ❤️点赞 👍 收藏 ⭐再看,养成习惯 环形链表 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可…

道路病害的检测与评估

基于yolov8道路病害的检测与评估 1 安装yolov8并使用 1.下载后: 2.选择为所有用户安装 3.选择一个合适的目录 4.第一个是自动添加环境变量,我们用默认的第二个后边手动添加 5.等待安装 1.1 安装anconda并配置环境变量 安装完成anconda之后,主要用的两个为Anaconda Prompt …

用树莓派获取传感器数据通过Onenet云平台(物模型)传输至微信小程序(上)

前言 为了传输传感器数据,在网上找了很多方法,但都因为各种各样的问题最终没能成功实现。最终找到这个既简单,又方便实现的方法。步骤有点多,希望大家可以跟着教程,一步步耐心的做下去,愿大家都能成功实现数…

ubuntu系统安装systemc-2.3.4流程

背景:systemC编程在linux下的基础环境配置 1,下载安装包,并解压 (先下载了最新的3.0.0,安装时候显示sc_cmnhdr.h:115:5: error: #error **** SystemC requires a C compiler version of at least C17 **** &#xff…

idea开发 java web 高校学籍管理系统bootstrap框架web结构java编程计算机网页

一、源码特点 java 高校学籍管理系统是一套完善的完整信息系统,结合java web开发和bootstrap UI框架完成本系统 ,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。 前段主要技术 css jq…

【云计算】云数据中心网络(一):VPC

云数据中心网络(一):VPC 1.什么是 VPC2.VPC 的组成2.1 虚拟交换机2.2 虚拟路由器 3.VPC 网络规划3.1 VPC 数量规划3.2 交换机数量规划3.3 地址空间规划3.4 不同规模企业地址空间规划实践 4.VPC 网络高可靠设计4.1 单地域单可用区部署4.2 单地…

【鸿蒙 HarmonyOS】@ohos.promptAction (弹窗)

一、背景 创建并显示文本提示框、对话框和操作菜单。 文档地址👉:文档中心 说明 本模块首批接口从API version 9开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 该模块不支持在UIAbility的文件声明处使用,即…

Premiere Pro 2024:赋予创意翅膀,让你的视频飞翔 mac/win版

Premiere Pro 2024,作为Adobe旗下的旗舰视频编辑软件,自推出以来,一直在视频制作领域占据着重要的地位。随着技术的不断进步和创新,Premiere Pro 2024为用户带来了前所未有的编辑体验,重新定义了视频制作的标准。 Pre…

爬虫 新闻网站 以湖南法治报为例(含详细注释) V1.0

目标网站:湖南法治报 爬取目的:为了获取某一地区更全面的在湖南法治报已发布的宣传新闻稿,同时也让自己的工作更便捷 环境:Pycharm2021,Python3.10, 安装的包:requests,csv&#xff…

刷题之Leetcode283题(超级详细)

283.移动零 283. 移动零https://leetcode.cn/problems/move-zeroes/ 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nu…

深度剖析鞋服品牌商品数字化管理的重要性

随着信息技术的迅猛发展与市场竞争的加剧,鞋服品牌商品数字化管理的重要性愈发凸显。数字化管理不仅关乎企业运营效率的提升,更是品牌实现差异化竞争、提升顾客体验、构建智慧零售生态的关键所在。对于鞋服品牌企业而言,提升商品数字化管理的…

P2089 烤鸡、P1706 全排列问题、P1157 组合的输出、P1036 [NOIP2002 普及组] 选数——Python代码实现(带注释)

P2089 烤鸡 题目背景 猪猪 Hanke 得到了一只鸡。 题目描述 猪猪 Hanke 特别喜欢吃烤鸡(本是同畜牲,相煎何太急!)Hanke 吃鸡很特别,为什么特别呢?因为他有 1010 种配料(芥末、孜然等&#xf…

面试经典150题——K 个一组翻转链表

1. 题目描述 2. 题目分析与解析 在这里推荐大家看一下这个解题思路: https://www.bilibili.com/video/BV11w411V7Ar/?spm_id_from333.337.search-card.all.click&vd_source7ea7c036902f5cb73c7f4781d1b0eaff 整体的算法思路如下: 初始化&#xff1a…

AWS入门实践-利用S3构建一个静态网站

使用Amazon S3托管静态网站是一个流行的选择,因为它简单、成本效益高,并且易于维护。静态网站由不含服务器端脚本的文件组成,如HTML、CSS和JavaScript文件。下面是使用S3托管静态网站的操作步骤: 如果大家没有AWS免费账号&#x…