0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用MM32F3270基于Azure RTOS事件标志组的应用

jf_pJlTbmA9 来源:灵动MM32MCU 作者:灵动MM32MCU 2023-10-27 11:31 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

简 介

Azure RTOS ThreadX 是 Microsoft 提供的高级工业级实时操作系统 (RTOS)。它是专门为深度嵌入式实时 IoT 应用程序设计的。Azure RTOS ThreadX 提供高级计划、通信、同步、计时器、内存管理和中断管理功能。此外,Azure RTOS ThreadX 具有许多高级功能,包括 picokernel™ 体系结构、preemption-threshold™ 计划、event-chaining™、执行分析、性能指标和系统事件跟踪。Azure RTOS ThreadX 非常易于使用,适用于要求极其苛刻的嵌入式应用程序。Azure RTOS ThreadX 在各种产品(包括消费者设备、医疗电子设备和工业控制设备)上的部署次数已达数十亿次。

具体的介绍和用户指南可以参考:

https://docs.microsoft.com/zh-cn/azure/rtos/threadx/

在前文描述移植基本内核的基础上,本文描述了如何基于MM32F3270系列MCU结合Azure RTOS ThreadX应用事件标志组的使用,引导用户理解Azure RTOS ThreadX事件标志组的功能。

表 1 适用系列型号

wKgaomUD5LSAM5-tAAAgWpJ2aBA500.png

1、移植应用的准备

1.1 硬件开发板的准备

该移植过程中应用的开发板为MM32的EVB-F3270,板载MM32F3273G9P。

wKgZomUD0G6AfPVFAAeCJdydFxg666.png

EVB-F3270 (MM32F3273G9P)的简要参数:

Arm Cortex-M3 内核

● 板载 MM32F3273G9P(LQFP144)

USB Host / Device、SPI、I2C

● 4 x Key、4 x LED

● I2S Speaker

TF-Card

Ethernet PHY

1.2 软件的准备

库函数和例程(Lib Samples)

该移植过程中应用的 Firmware 分别为 MM32F3270 库函数和例程,下载地址:

https://www.mindmotion.com.cn/products/mm32mcu/mm32f/mm32f_mainstream/mm32f3270/

wKgaomUD0HCALXFWAAB_Ctq_biQ840.png

Azure RTOS ThreadX(源码)

ThreadX 的源代码已经开放,我们可以从 ThreadX 公共源代码存储库获取 Azure RTOS ThreadX,网址为:https://github.com/azure-rtos/threadx/

具体的商用使用条件参考Azure的许可证说明:

https://www.microsoft.com/en-us/legal/intellectualproperty/tech-licensing/programs?msclkid=f7ab4ff3afa011ec90a79366a52034fa activetab=pivot1:primaryr11

Microsoft publishes the Azure RTOS source code to GitHub. No license is required to install and use the software for internal development, testing, and evaluation purposes. A license is required to distribute or sell components and devices unless using Azure RTOS licensed hardware.

Azure RTOS 何时需要许可证?

Microsoft 将 Azure RTOS 源代码发布到 GitHub。安装和使用该软件进行内部开发、测试和评估无需许可证。分发或销售组件和设备需要许可证,除非使用 Azure RTOS 许可的硬件。

ThreadX 安装

可以通过将 GitHub 存储库克隆到本地计算机来安装 ThreadX。下面是用于在 PC 上创建 ThreadX 存储库的克隆的典型语法。

shell复制

git clone https://github.com/azure-rtos/threadx

或者,也可以使用 GitHub 主页上的“下载”按钮来下载存储库的副本。

下载后的仓库代码目录列表如下:

wKgZomUD0HGAS4OEAAB8V8GujVs022.png

Azure RTOS ThreadX(源码)支持的开发环境

ThreadX 内核提供好了各种主流硬件平台和软件平台的移植文件,以Cortex_M3为例,可以支持以下六种开发环境:

wKgaomUD0HOAGQOLAAAVCEgEeAE264.png

本次移植过程使用Azure RTOS原有的sample_threadx.c Samples为例子,稍作修改,演示了事件标志组的功能与应用。

2、Threadx 事件标志组的应用

该章节介绍了事件标志组应用实现的过程和注意事项,该演示程序可在MM32F3273G9P的EVB-F3270上运行。

此示例在文件 main_event_flags_demo.c 中定义,旨在说明如何在嵌入式多线程环境中使用事件标志组,实现任务之间的数据信号传递与中断或任务同步的相互关系。

2.1 Azure Threadx event简介

事件标志是Threadx线程同步的一个强大工具。事件标志可以被任何线程设置或清除,也可以被任何线程检查。线程可以在等待设置某些事件标志组时挂起。

每个事件标志用1 bit表示,事件标志以32个为一组排列,组成一个事件标志组。之后的所有操作都是以组为单位。

wKgZomUD5L2ACqKMAAAHIdHaRXg942.png

线程可以同时对一个组中的所有32个事件标志进行操作。

要设置或清除事件标志组,可以使用tx_event_flags_set服务。

使用tx_event_flags_get服务可以“获取”事件标志组。

获取事件标志时,线程可以等待一个事件标志(一段时间或永久等待),直到该事件标志被另一个线程或中断设置为1(set状态)。

对于嵌入式应用来说,就有点像对一个个的寄存器位进行“ ”和“|”操作。

使用事件标志组可以有效的解决中断服务程序和任务之间的同步问题。

wKgaomUD5L6ATEOFAACmJ_T8xow709.png

2.2 Azure Threadx event的结构体

Event的结构体

typedef struct TX_EVENT_FLAGS_GROUP_STRUCT
{
    /* Define the event flags group ID used for error checking.  */
    ULONG               tx_event_flags_group_id;
    /* Define the event flags group's name.  */
    CHAR                *tx_event_flags_group_name;
    /* Define the actual current event flags in this group. A zero in a
       particular bit indicates the event flag is not set.  */
    ULONG               tx_event_flags_group_current;
    /* Define the reset search flag that is set when an ISR sets flags during
       the search of the suspended threads list.  */
    UINT                tx_event_flags_group_reset_search;
    /* Define the event flags group suspension list head along with a count of
       how many threads are suspended.  */
    struct TX_THREAD_STRUCT
                        *tx_event_flags_group_suspension_list;
    UINT                tx_event_flags_group_suspended_count;
    /* Define the created list next and previous pointers.  */
    struct TX_EVENT_FLAGS_GROUP_STRUCT
                        *tx_event_flags_group_created_next,
                        *tx_event_flags_group_created_previous;
    /* Define the delayed clearing event flags.  */
    ULONG               tx_event_flags_group_delayed_clear;
#ifdef TX_EVENT_FLAGS_ENABLE_PERFORMANCE_INFO
    /* Define the number of event flag sets.  */
    ULONG               tx_event_flags_group_performance_set_count;
    /* Define the number of event flag gets.  */
    ULONG               tx_event_flags_group__performance_get_count;
    /* Define the number of event flag suspensions.  */
    ULONG               tx_event_flags_group___performance_suspension_count;
    /* Define the number of event flag timeouts.  */
    ULONG               tx_event_flags_group____performance_timeout_count;
#endif
#ifndef TX_DISABLE_NOTIFY_CALLBACKS
    /* Define the application callback routine used to notify the application when
       an event flag is set.  */
    VOID                (*tx_event_flags_group_set_notify)(struct TX_EVENT_FLAGS_GROUP_STRUCT *group_ptr);
#endif
    /* Define the port extension in the event flags group control block. This
       is typically defined to whitespace in tx_port.h.  */
    TX_EVENT_FLAGS_GROUP_EXTENSION
} TX_EVENT_FLAGS_GROUP;

Event flags包含成员的含义:

wKgaomUD5MCAR9pdAABWNROgg4U120.png

2.3 Azure Threadx event的主要函数与功能

事件标志组的主要函数

wKgZomUD5MGAWFLUAABQC6xt-eQ507.png

2.4 事件标志组的应用演示

2.4.1 工程目录的建立

打开目标工程文件夹“MM32F3270Project”:

wKgaomUD0HSAf2J-AAAVVpkOLro020.png

移除原有样例.c 文件sample_threadx.c:

wKgZomUD0HaAUtetAACojJGdRw4242.png

参考sample_threadx.c建立main_event_flags_demo.c文件,并添加hardware目录中的led.c到工程项目中。

wKgZomUD5MWAGLLCAAAub6vsmtA647.png

2.4.2 创建事件标志组tx_event_flags_create

声明需要使用的事件标志组变量。

调用tx_event_flags_create, 建立一个事件标志组。

创建一个待使用的事件标志组

#include "tx_api.h"

#define DEMO_STACK_SIZE         1024

/* Define the ThreadX object control blocks...  */
TX_THREAD               thread_0;
TX_THREAD               thread_5;

TX_EVENT_FLAGS_GROUP    event_flags_0;

/* Define what the initial system looks like.  */
void    tx_application_define(void *first_unused_memory)
{
    /* Create the main thread.  */
    tx_thread_create( thread_0, "thread 0", thread_0_entry, 0,  
            thread_0_stack, DEMO_STACK_SIZE, 
            1, 1, TX_NO_TIME_SLICE, TX_AUTO_START);
    /* Create thread 5.  This thread simply pends on an event flag which will be set
       by thread_0.  */
    tx_thread_create( thread_5, "thread 5", thread_5_entry, 5,  
            thread_5_stack, DEMO_STACK_SIZE, 
            4, 4, TX_NO_TIME_SLICE, TX_AUTO_START);
    /* Create the event flags group used by threads 0 and 5.  */
    tx_event_flags_create( event_flags_0, "event flags 0");
}

函数原型:

tx_event_flags_create函数原型

UINT  _tx_event_flags_create(TX_EVENT_FLAGS_GROUP *group_ptr, CHAR *name_ptr)

参数:

● group_ptr:指向事件标志组控制块的指针。

● name_ptr:指向事件标志组名称的指针。

返回值:

● TX_SUCCESS:(0X00) 成功创建事件组。

● TX_GROUP_ERROR:(0x06) 事件组指针无效。指针为 NULL 或事件组已创建。

● NX_CALLER_ERROR:(0x13) 此服务的调用方无效。

应用中该实现函数:

tx_event_flags_create( event_flags_0, "event flags 0");

A. 第1个参数是事件标志组引用的指针,引用声明的事件标注“event_flags_0”指向的地址。

B. 第2个参数是事件标志组的名字,字符串值为" event flags 0"。

2.4.3 创建一个任务用于发送事件标志组

在此建立一个定时发送一个事件标志组的简单任务,发送完成,发送任务计数值加一:

创建一个发送事件标志组的任务

/* Define the test threads.  */
void    thread_0_entry(ULONG thread_input)
{
    UINT status;
    /* This thread simply sits in while-forever-sleep loop.  */
    while(1)
    {
        /* Increment the thread counter.  */
        thread_0_counter++;
        /* Sleep for 10 ticks.  */
        tx_thread_sleep(10);
        /* Set event flag 0 to wakeup thread 5.  */
        status =  tx_event_flags_set( event_flags_0, 0x1, TX_OR);
        /* Check status.  */
        if (status != TX_SUCCESS)
            break;
    }
}

函数原型:

_tx_event_flags_set函数原型

UINT  _tx_event_flags_set(TX_EVENT_FLAGS_GROUP *group_ptr, ULONG flags_to_set, UINT set_option)

参数:

● group_ptr:指向以前创建的事件标志组控制块的指针。

● flags_to_set:根据所选的 set-option,指定要设置或清除的事件标志。

● set_option:指定将所指定的事件标志与该组的当前事件标志进行“AND”或“OR”运算。以下是有效的选择:

- TX_AND (0x02)

- TX_OR (0x00)

如果选择 TX_AND,则会指定将所指定的事件标志与该组的当前事件标志进行“AND”运算。此选项通常用于清除组中的事件标志。否则,如果指定了 TX_OR,则对所指定的事件标志与该组的当前事件标志进行“OR”运算。

返回值:

● TX_SUCCESS:(0X00) 成功设置事件标志。

● TX_GROUP_ERROR:(0x06) 指向事件标志组的指针无效。

● TX_OPTION_ERROR:(0x08) 指定的 set-option 无效。

应用中该实现函数:

status = tx_event_flags_set( event_flags_0, 0x1, TX_OR);

A. 第1个参数是事件标志组引用的指针,引用声明的事件标注“event_flags_0”指向的地址。

B. 第2个参数是事件标志组的名字,字符串值为" event flags 0"。

返回值

C. 第3个参数是TX_OR,则对所指定的事件标志与该组的当前事件标志进行“OR”运算。

2.4.4 创建一个任务接收事件标志组

在此建立一个任务,实现接收收事件标志组,接收事件设置值成功,接收任务计数值加一:

创建一个接收事件标志组任务

void    thread_5_entry(ULONG thread_input)
{
    UINT status;
    ULONG actual_flags;
    /* This thread simply waits for an event in a forever loop.  */
    while(1)
    {
        /* Increment the thread counter.  */
        thread_5_counter++;
        /* Wait for event flag 0.  */
        status =  tx_event_flags_get( event_flags_0, 0x1, TX_OR_CLEAR, 
         actual_flags, TX_WAIT_FOREVER);
        /* Check status.  */
        if ((status != TX_SUCCESS) || (actual_flags != 0x1))
            break;
    }
}

函数原型:

_tx_event_flags_set函数原型

UINT  _tx_event_flags_get(TX_EVENT_FLAGS_GROUP *group_ptr, ULONG requested_flags,
                    UINT get_option, ULONG *actual_flags_ptr, ULONG wait_option)

参数:

● group_ptr:指向以前创建的事件标志组的指针。

● requested_flags:32 位无符号变量,表示请求的事件标志。

● get_option:指定是否需要所有或任何请求的事件标志。以下是有效的选择:

- TX_AND (0x02)

- TX_AND_CLEAR (0x03)

- TX_OR (0x00)

- TX_OR_CLEAR (0x01)

如果选择 TX_AND 或 TX_AND_CLEAR,则会指定所有事件标志在组中都必须存在。如果选择 TX_OR 或 TX_OR_CLEAR,则会指定任何事件标志都符合要求。如果指定 TX_AND_CLEAR 或 TX_OR_CLEAR,则会清除满足请求的事件标志(设置为零)。

● actual_flags_ptr:指向放置检索到的事件标志的位置这一目标的指针。注意,实际获得的标志可能包含没有请求的标志。

● wait_option:定义未设置所选事件标志时服务的行为方式。

等待选项的定义如下:

- TX_NO_WAIT (0x00000000) - 如果选择 TX_NO_WAIT,则无论此服务是否成功,都会导致立即从此服务返回。如果从非线程(例如初始化、计时器或 ISR)调用服务,则这是唯一有效的选项。

- TX_WAIT_FOREVER 超时值 (0xFFFFFFFF) - 选择 TX_WAIT_FOREVER 会导致发出调用的线程无限期挂起,直到事件标志可用为止。

- 超时值(0x00000001 至 0xFFFFFFFE)- 如果选择一个数值(1 到 0xFFFFFFFE),则会指定在等待事件标志时发出调用的线程保持挂起的最大计时器时钟周期数。

返回值:

● TX_SUCCESS:(0X00) 成功获取事件标志。

● TX_DELETED:(0x01) 线程挂起时删除了事件标志组。

● TX_NO_EVENTS:(0X07) 服务无法在指定的等待时间内获取指定的事件。

● TX_WAIT_ABORTED:(0x1A) 挂起状态由其他线程、计时器或 ISR 中止。

● TX_GROUP_ERROR:(0x06) 事件标志组指针无效。

● TX_PTR_ERROR:(0x03) 指向实际事件标志的指针无效。

● TX_WAIT_ERROR:(0x04) 从非线程调用时指定了除 TX_NO_WAIT 以外的等待选项。

● TX_OPTION_ERROR:(0x08) 指定的 get-option 无效。

应用中该实现函数:

status = tx_event_flags_get( event_flags_0, 0x1, TX_OR_CLEAR, actual_flags, TX_WAIT_FOREVER);

A. 第1个参数是事件标志组引用的指针,引用声明的事件标注“event_flags_0”指向的地址。

B. 第2个参数是根据所选的 get-option,指定要设置或清除的事件标志等于0x01。

C. 第3个参数是TX_OR_CLEAR,则会判断指定任何事件标志都符合要求,符合后并清除。

3、Threadx 的事件标志组应用实现与调试

3.1 代码实现

下载调试默认会运行到main()函数,如下为全部实现的代码。

Demo演示代码

/* This is a small demo of the high-performance ThreadX kernel.  It includes examples of six
   threads of different priorities, using a message an event flags group.  */

#include "tx_api.h"

#define DEMO_STACK_SIZE         1024

/* Define the ThreadX object control blocks...  */
TX_THREAD               thread_0;
TX_THREAD               thread_5;

TX_EVENT_FLAGS_GROUP    event_flags_0;

/* Define the counters used in the demo application...  */
ULONG                   thread_0_counter;
ULONG                   thread_5_counter;

/* Define the thread stacks.  */
UCHAR                   thread_0_stack[DEMO_STACK_SIZE];
UCHAR                   thread_5_stack[DEMO_STACK_SIZE];

/* Define thread prototypes.  */
void    thread_0_entry(ULONG thread_input);
void    thread_5_entry(ULONG thread_input);

/* Define main entry point.  */
int main()
{
    /* Enter the ThreadX kernel.  */
    tx_kernel_enter();
}

/* Define what the initial system looks like.  */
void    tx_application_define(void *first_unused_memory)
{
    /* Create the main thread.  */
    tx_thread_create( thread_0, "thread 0", thread_0_entry, 0,  
            thread_0_stack, DEMO_STACK_SIZE, 
            1, 1, TX_NO_TIME_SLICE, TX_AUTO_START);
    /* Create thread 5.  This thread simply pends on an event flag which will be set
       by thread_0.  */
    tx_thread_create( thread_5, "thread 5", thread_5_entry, 5,  
            thread_5_stack, DEMO_STACK_SIZE, 
            4, 4, TX_NO_TIME_SLICE, TX_AUTO_START);
    /* Create the event flags group used by threads 0 and 5.  */
    tx_event_flags_create( event_flags_0, "event flags 0");
}

/* Define the test threads.  */
void    thread_0_entry(ULONG thread_input)
{
    UINT status;
    /* This thread simply sits in while-forever-sleep loop.  */
    while(1)
    {
        /* Increment the thread counter.  */
        thread_0_counter++;
        /* Sleep for 10 ticks.  */
        tx_thread_sleep(10);
        /* Set event flag 0 to wakeup thread 5.  */
        status =  tx_event_flags_set( event_flags_0, 0x1, TX_OR);
        /* Check status.  */
        if (status != TX_SUCCESS)
            break;
    }
}

void    thread_5_entry(ULONG thread_input)
{
    UINT status;
    ULONG actual_flags;
    /* This thread simply waits for an event in a forever loop.  */
    while(1)
    {
        /* Increment the thread counter.  */
        thread_5_counter++;
        /* Wait for event flag 0.  */
        status =  tx_event_flags_get( event_flags_0, 0x1, TX_OR_CLEAR, 
                                                 actual_flags, TX_WAIT_FOREVER);
        /* Check status.  */
        if ((status != TX_SUCCESS) || (actual_flags != 0x1))
            break;
    }
}

3.2 下载与调试

进入调试模式,可以看到接收事件标志组成功。

wKgaomUD5MaAHpzaAADYqP6k5ns431.png

该demo示例,建立了2个线程,程序执行一个发送事件标志,另外一个线程接收事件标志,实现执行Task Counter与发送 接收的Message Counter的累加。

全速运行后,可以看到相关的数值在变化:

wKgZomUD5MmAVShTAAAz4ZXPODg191.png

4、小结

这个演示程序中,使用了tx_thread_sleep()函数做了延时,刚好使得发送事件标志组与接收事件标志组一一配对,计数值累加后都是相等的,说明同步成功。

Azure RTOS ThreadX 的使用事件标志组可以方便实现任务对任务或任务对中断的同步,结合MM32F3270的强大性能,可以实现Azure RTOS的各种特色功能。

来源:灵动MM32MCU
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • RTOS
    +关注

    关注

    25

    文章

    863

    浏览量

    122619
  • Azure
    +关注

    关注

    1

    文章

    129

    浏览量

    13621
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    RTOS Crash 问题全维度分析与解决指南

    定时器/事件标志泄露3. 任务创建数超过configMAX_PRIORITIES 内核返回错误码(如errQUEUE_FULL)、后续API调用崩溃、系统无可用任务控制块(TCB
    发表于 12-08 03:56

    基于灵动MM32F3270微控制器的监护仪主控方案(MCU微控制器介绍)

    的医疗监护网络。为提升医疗数据的准确性与系统响应速度,采用高性能的MCU微控制器作为主控芯片至关重要。本文介绍基于灵动MM32F3270 MCU芯片的监护仪解决方案,该方案具备高集成、高算力与丰富的接口资源,满足现代医疗设备对实时性和可靠性的严苛要求。
    的头像 发表于 11-07 15:04 215次阅读
    基于灵动<b class='flag-5'>MM32F3270</b>微控制器的监护仪主控方案(MCU微控制器介绍)

    灵动微MM32F3270微控制器的音频设备参考方案

    音频设备系统的主控芯片采用灵动微MM32F3270微控制器。微控制器内核采用高性能的Arm®Cortex-M3 32位处理器,最高工作频率可达120MHz,内置高速存储器,并配备丰富的I/O端口和多种外设,为音频应用提供强有力的硬件支持。
    的头像 发表于 11-04 16:09 212次阅读

    如何使用 NuMaker 板和 Mbed OS 上的连接字符串连接到 Azure IoT?

    使用 NuMaker 板和 Mbed OS 上的连接字符串连接到 Azure IoT
    发表于 09-04 07:46

    请问编译纯rtos到底是选择Linux+rtos的sdk编译only rtos还是直接使用rtos sdk?

    编译纯rtos到底是选择Linux+rtos的sdk编译only rtos还是直接使用rtos sdk?
    发表于 07-11 07:22

    如何在Eclipse ThreadX RTOS中集成SystemView

    SEGGER实时软件分析工具SystemView已经在ThreadX v6.4.2上进行了测试。SystemView从v3.60c版本支持Eclipse ThreadX(Azure RTOS),用户
    的头像 发表于 05-06 17:11 1186次阅读

    SEGGER SystemView支持Eclipse ThreadX

    SEGGER的实时软件分析工具SystemView v3.60c版本现已支持Eclipse ThreadX(Azure RTOS),用户可以基于Systemview记录ThreadX操作系统事件并执行分析。
    的头像 发表于 04-09 10:43 830次阅读
    SEGGER SystemView支持Eclipse ThreadX

    灵动微电子推出全新超值型MM32F0050系列MCU

    灵动微电子推出全新超值型MM32F0050系列MCU。2018年,灵动首次上市了其主打性价比的超值型MM32F00系列,目前已陆续推出了F003、F0010、
    的头像 发表于 04-01 09:36 1374次阅读
    灵动微电子推出全新超值型<b class='flag-5'>MM32F</b>0050系列MCU

    详解RTOS中的Hook函数

    Hook函数是RTOS中的一个关键特性,通过该函数,用户可以增强对任务管理的控制,定义系统行为。
    的头像 发表于 03-24 16:14 843次阅读

    移植RT-Thread到灵动微MM32F5265开发板教程

    近期,笔者有幸获得灵动微 MM32F5265 开发板的体验资格。MM32F5260 搭载了 arm china "Star-MC1 内核"处理器,拥有高性能,主打家电和工业等高可靠性应用领域。
    的头像 发表于 03-17 10:16 1905次阅读
    移植RT-Thread到灵动微<b class='flag-5'>MM32F</b>5265开发板教程

    RTOS中的本地存储指针使用

    本地存储指针是RTOS中的一个重要特性,增强了任务管理和数据处理能力。在RTOS上下文中,本地存储是指存储在本地的特定任务或对象的数据。通常与任务本地存储(Task Local Storage,TLS)有关,其中数据存储在任务控制块(TCB)中,允许每个任务具有私有的、特
    的头像 发表于 02-28 16:33 1176次阅读
    <b class='flag-5'>RTOS</b>中的本地存储指针使用

    佳能发布RF16-28mm F2.8 IS STM镜头

    67mm,便于日常携带。它拥有F2.8恒定大光圈,采用1316片的光学设计,包括2片非球面镜片和4片UD镜片,能有效校正像差和色差,使画面从中心到边缘都有出色的锐度与清晰度。 RF16-28
    的头像 发表于 01-24 09:52 1032次阅读

    灵动微电子MM32F5370 MCU产品特色

    MM32F3、灵动·天枢 MM32F5、灵动·玉衡 MM32G5、灵动·天玑 MM32H5 等子系列,MM32F5270、
    的头像 发表于 01-10 10:02 2140次阅读
    灵动微电子<b class='flag-5'>MM32F</b>5370 MCU产品特色

    Flexible Safety RTOS的技术特征

    Embedded Office的Flexible Safety RTOS是专为具有严格功能安全要求的嵌入式系统量身定制的、先进的实时操作系统。该RTOS专为工业自动化、汽车、铁路和医疗设备等行业而设
    的头像 发表于 01-07 11:29 1005次阅读

    使用任务通知提高RTOS应用的效率

    在实时嵌入式系统中,性能和资源效率是决定设计成败的关键因素。传统的实时操作系统(RTOS)提供了如队列、信号量和事件机制,实现任务之间的同步和通信。FreeRTOS/SAFERTOS还提供一种方法可以使这些过程更快、更轻量化,即任务通知。
    的头像 发表于 12-27 14:54 1080次阅读