MSP432P401R TI Drivers 库函数学习笔记(二)认识TI-RTOS (TI-POSIX)

目录

  • 简介
    • TI-RTOS
    • FreeRTOS
    • POSIX
    • 运行时对象查看器 (Runtime Object Viewer)
  • TI-POSIX 介绍
    • 在源代码中使用 POSIX
    • TI-POSIX支持的函数摘要
      • 线程函数调用的前后关系
        • 线程管理
        • 线程属性
        • 线程同步
        • 障碍属性
        • 条件变量
        • 条件变量属性
        • 互斥锁
        • 互斥属性
        • 读写锁定
        • 读写锁属性
      • 辅助函数调用的前后关系
        • 时钟
        • 消息队列
        • 信号量
        • 睡眠
        • 计时器
  • 注意事项
    • 线程默认堆栈大小和线程默认优先级
    • 线程调度策略
    • FreeRTOS上的TI-POSIX
    • 二进制信号量

平台:Code Composer Studio 10.4.0
MSP432P401R SimpleLink™ 微控制器 LaunchPad™ 开发套件
(MSP-EXP432P401R)


本文内容机翻自
SimpleLink™ MCU SDKs: RTOS and POSIX 和 TI-POSIX User’s Guide

简介

       SimpleLinkTM 微控制器(MCU)平台的软件开发工具包(sdk)具有通用组件和特定于设备的中间件,加快了上市时间,并提供了有线和无线设备的 SimpleLink 整个 MCU 组合的统一开发经验。关于 SimpleLink SDK 的框图,请参阅下图。在本文中,我将更深入地探讨 SimpleLink SDK 中包含的组件如何使您能够使用实时操作系统(RTOS)创建确定的、高效的、可伸缩的应用程序。
在这里插入图片描述

TI-RTOS

       TI-RTOS SimpleLink SDK 集成了 TI-RTOS,一个功能齐全的实时操作系统。所有 TI SimpleLink sdk 都预先安装了 TI-rtos 内核,并且与 Portable Operating System Interface (POSIX)兼容。TI-RTOS 是一个您可以信任的健壮解决方案,已经部署在各种 TI 嵌入式解决方案的数千个应用程序中。内核是开放源码的(开源 BSD [ BSD ]许可证) ,与 TI 的硅组合同步开发,以实现非常低的延迟,高效的代码占用。TI-RTOS 帮助您优化您的应用程序的功耗,性能和代码大小,以满足您的独特需求。具体地说,TI-RTOS 的电源管理功能使您能够以最小的努力和直观的应用程序编程接口(api)为应用程序实现积极的功耗节省。
       TI-RTOS 内核的中心是调度程序,它确保最高优先级的线程正在运行。这提供了确定性和快速的运算。TI-RTOS 支持四种不同类型的线程: 硬件中断(Hwis)、软件中断(Swis)、任务和空闲,如下面的图2所示。TI-RTOS 提供了几种线程通信机制,如信号量、邮箱、队列、门和事件。此外,TI-RTOS 包括系统级的计时服务和内存管理器,以确保您的应用程序尽可能高效和精简。
在这里插入图片描述

FreeRTOS

       开发 SimpleLink SDK 是模块化的,允许您在 ti-RTOS 之外使用可选的 RTOS 内核。除了 TI-RTOS,MSP432™ 和 Wi-Fi ® CC3220软件开发包(sdk)还包括使用流行的 FreeRTOS 的能力。SimpleLink sdk 的模块性使您可以轻松插入首选的操作系统/内核,从而获得最大的灵活性。

POSIX

       POSIX The SimpleLink SDK 还提供了与 POSIX 兼容的 api。POSIX 是一个电气和电子工程师协会(IEEE)的操作系统兼容性 API 行业标准。POSIX 层抽象了应用程序使用的 RTOS 内核功能。在典型的应用程序中,POSIX 层只需要少于2KB 的代码,因此可以重用示例和用户应用程序,并将其移植到不同的内核。使用这个层是可选的,但是这意味着你可以使用任何你目前熟悉的或者将来想要移动到的操作系统。POSIX 兼容性还允许 TI 第三方合作伙伴与 SimpleLink SDK 设备进行接口,以增加对其内核的支持,从而为包括 FreeRTOS 在内的任何操作系统的设计提供完全自由。

运行时对象查看器 (Runtime Object Viewer)

       运行时对象查看器为了帮助您优化启用 rtos 的应用程序,TI 提供了强大的工具来帮助您调试和监视代码。具体来说,Runtime Object Viewer (ROV2)提供了一个强大的可视化和检测界面,可以帮助您监视线程状态、堆使用情况和中央处理器(CPU)负载。下面的图3显示了一些可用的仪表板,以帮助您进行调试。尽管 ROV2可以为您支持 RTOS 的应用程序提供有用的洞察力,但 ROV2工具具有足够的灵活性,可以在应用程序中显示与任何库、 RTOS 或其他相关的高级信息。
在这里插入图片描述

TI-POSIX 介绍

在源代码中使用 POSIX

在源代码中使用 Open Group Specification 定义的文件名包含 POSIX 头文件。例如,使用以下命令创建一个 POSIX 线程:

#include <pthread.h>

void *start_fxn(void *arg);
pthread_t thread;
int arg = 1;

pthread_create(&thread, NULL, start_fxn, (void *)&arg);

在 SYS/BIOS 的以前版本中,POSIX 头文件使用包限定的路径名包含在内。这已经不再受支持了。不要使用下列包括语句:

#include <ti/sysbios/posix/pthread.h>       INCORRECT
#include <ti/sysbios/posix/sys/types.h>     INCORRECT

使用以下包括语句:

#include <pthread.h>
#include <sys/types.h>

TI-POSIX支持的函数摘要

在实时操作系统前后关系中,有三种前后关系:
main
在main()函数中,在调用RTOS调度器之前
task
在本地RTOS线程中(即不是从pthread中)
interrupt
在中断服务程序中

线程函数调用的前后关系

线程管理

函数名用途maintask
pthread_cancel向线程发送取消请求NoYes
pthread_cleanup_pop弹出线程取消清理处理程序NoYes
pthread_cleanup_push推取消线程清理处理程序NoNo
pthread_create创建一个新线程YesYes
pthread_detach分离一个线程NoYes
pthread_equal比较线程 idYesYes
pthread_exit终止调用线程NoNo
pthread_getconcurrency不支持
pthread_getcpuclockid不支持
pthread_getschedparam用于获取 pthread 的优先级NoYes
pthread_getspecific获取调用线程的线程特定数据NoNo
pthread_join用终止线程连接NoYes
pthread_key_create创建特定于线程的数据键NoNo
pthread_key_delete删除线程特定的数据键NoNo
pthread_once运行一次初始化例程NoYes
pthread_self获取调用线程的 IDNoNo
pthread_setcancelstate设置取消能力状态和类型NoNo
pthread_setcanceltype不支持。只支持异步取消
pthread_setconcurrency不支持
pthread_setschedparam用于设置线程的优先级NoNo
pthread_setschedprio不支持。使用 pthread_setschedparam 来设置优先级
pthread_setspecific设置调用线程的线程特定数据NoNo
pthread_testcancel不支持

线程属性

函数名用途maintask
pthread_attr_destroy销毁线程属性对象YesYes
pthread_attr_getdetachstate获取属性对象中的分离状态YesYes
pthread_attr_getguardsize获取属性对象中的保护大小YesYes
pthread_attr_getinheritsched不支持的内核调度策略是固定的
pthread_attr_getschedparam获取属性对象中的调度参数YesYes
pthread_attr_getschedpolicy不支持的内核调度策略是固定的
pthread_attr_getscope不支持的内核没有进程的概念
pthread_attr_getstack获取堆栈大小和地址属性YesYes
pthread_attr_getstacksize获取属性对象中的堆栈大小YesYes
pthread_attr_init初始化线程属性YesYes
pthread_attr_setdetachstate在属性对象中设置分离状态YesYes
pthread_attr_setguardsize在属性对象中设置保护大小YesYes
pthread_attr_setinheritsched不支持的内核调度策略是固定的
pthread_attr_setschedparam在属性对象中设置调度参数YesYes
pthread_attr_setschedpolicy不支持的内核调度策略是固定的
pthread_attr_setscope不支持的内核没有进程的概念
pthread_attr_setstack设置堆栈大小和地址YesYes
pthread_attr_setstacksize设置堆栈大小YesYes

线程同步

函数名用途maintask
pthread_barrier_destroy摧毁一个障碍物YesYes
pthread_barrier_init初始化一个障碍物体YesYes
pthread_barrier_wait在屏障处同步NoYes

障碍属性

函数名用途maintask
pthread_barrierattr_destroy破坏 barrier 属性对象YesYes
pthread_barrierattr_getpshared不支持的内核没有进程的概念
pthread_barrierattr_init初始化 barrier 属性对象YesYes
pthread_barrierattr_setpshared不支持的内核没有进程的概念

条件变量

函数名用途maintask
pthread_cond_broadcast取消阻止条件变量上阻塞的所有线程NoYes
pthread_cond_destroy为条件变量分配的可用资源YesYes
pthread_cond_init分配和初始化条件变量YesYes
pthread_cond_signal取消阻止等待条件变量的线程NoYes
pthread_cond_timedwait使用超时等待条件变量NoYes
pthread_cond_wait等待条件变量NoYes

条件变量属性

函数名用途maintask
pthread_condattr_destroy销毁条件变量属性对象YesYes
pthread_condattr_getclock不支持
pthread_condattr_getpshared不支持
pthread_condattr_init初始化条件变量属性对象YesYes
pthread_condattr_setclock不支持
pthread_condattr_setpshared不支持

互斥锁

函数名用途maintask
pthread_mutex_destroy为互斥对象分配的自由资源YesYes
pthread_mutex_getprioceiling获取互斥锁的优先级上限YesYes
pthread_mutex_init分配和初始化互斥对象YesYes
pthread_mutex_lock锁定互斥锁NoNo
pthread_mutex_setprioceiling设置互斥锁的优先级上限NoYes
pthread_mutex_timedlock等待带超时的互斥对象NoNo
pthread_mutex_trylock锁定一个互斥锁,如果它是可用的,不阻塞返回NoNo
pthread_mutex_unlock解锁调用线程拥有的互斥对象NoNo

互斥属性

函数名用途maintask
pthread_mutexattr_destroy销毁互斥属性对象YesYes
pthread_mutexattr_getprioceiling获取互斥锁属性对象的优先级上限YesYes
pthread_mutexattr_getprotocol获取互斥锁属性对象的协议YesYes
pthread_mutexattr_getpshared不支持
pthread_mutexattr_gettype获取互斥类型属性YesYes
pthread_mutexattr_init初始化互斥属性对象YesYes
pthread_mutexattr_setprioceiling设置互斥对象的优先级上限YesYes
pthread_mutexattr_setprotocol设置互斥锁属性对象的协议YesYes
pthread_mutexattr_setpshared不支持
pthread_mutexattr_settype设置互斥类型属性YesYes

读写锁定

函数名用途maintask
pthread_rwlock_destroy销毁一个读写锁对象YesYes
pthread_rwlock_init初始化一个读写锁对象YesYes
pthread_rwlock_rdlock锁定读写锁对象进行读取NoNo
pthread_rwlock_timedrdlock锁定一个读写锁对象,用于超时读取NoNo
pthread_rwlock_timedwrlock使用超时锁定写入的读写锁定NoNo
pthread_rwlock_tryrdlock尝试读写锁以进行读取(非阻塞)NoNo
pthread_rwlock_trywrlock尝试使用读写锁进行写入(非阻塞)NoNo
pthread_rwlock_unlock解锁一个读写锁对象NoNo
pthread_rwlock_wrlock锁定一个读写锁对象进行写入NoNo

读写锁属性

函数名用途maintask
pthread_rwlockattr_destroy销毁读写锁属性对象YesYes
pthread_rwlockattr_getpshared不支持
pthread_rwlockattr_init初始化读写锁属性对象YesYes
pthread_rwlockattr_setpshared不支持

辅助函数调用的前后关系

时钟

函数名用途maintask
clock_gettime获取当前时间YesYes
clock_nanosleep高分辨率睡眠,可指定时钟NoYes
clock_settime为CLOCK REALTIME时钟设置当前时间YesYes

消息队列

函数名用途maintask
mq_close关闭消息队列YesYes
mq_getattr获取消息队列属性YesYes
mq_open打开一个消息队列YesYes
mq_receive从消息队列接收消息NoYes
mq_send向消息队列发送消息NoYes
mq_setattr设置消息队列属性YesYes
mq_timedreceive接收来自消息队列的消息,带有超时NoYes
mq_timedsend使用超时向消息队列发送消息NoYes
mq_unlink删除消息队列YesYes

信号量

函数名用途maintask
sem_destroy销毁一个信号量YesYes
sem_getvalue获取信号量计数YesYes
sem_init初始化信号量YesYes
sem_post解锁一个信号量(即增加信号量计数)YesYes
sem_timedwait带超时锁定信号量NoYes
sem_trywait尝试锁定信号量(非阻塞)NoYes
sem_wait锁定信号量NoYes

睡眠

函数名用途maintask
nanosleep高分辨率睡眠NoYes

计时器

函数名用途maintask
timer_create创建一个计时器YesYes
timer_delete删除计时器YesYes
timer_gettime获取计时器到期之前的时间YesYes
timer_settime设置计时器下一次到期的时间YesYes

注意事项

线程默认堆栈大小和线程默认优先级

int pthread_attr_init(pthread_attr_t *attr)

pthread_attr_init()使用默认值初始化所指向的对象,其中包括堆栈大小和线程优先级。pthread_attr_t、attr
在 TI-RTOS 上,默认堆栈大小在配置脚本中定义。

var Task = xdc.useModule('ti.sysbios.knl.Task');
Task.defaultStackSize = 0x800;

在 FreeRTOS 上,使用 FreeRTOS.config.h 和 portmacro.h 头文件中定义的值计算默认堆栈大小如下。

configPOSIX_STACK_SIZE * sizeof(portSTACK_TYPE)

注意,这是一个自定义符号,定义在SDK中的FreeRTOSConfig.h头文件中。h头文件是在FreeRTOS发行版中附带的。configPOSIX_STACK_SIZE
优先级设置为1,这是Idle任务之外允许的最低优先级,Idle任务的优先级为0。

线程调度策略

int pthread_getschedparam(pthread_t pthread, int *policy, struct sched_param *param)
int pthread_setschedparam(pthread_t pthread, int policy, const struct sched_param *param)

RTOS 内核使用了一个基于优先级的调度程序

FreeRTOS上的TI-POSIX

我们已经尽最大努力在TI-RTOS和FreeRTOS之间提供同样的支持。然而,这里也有一些例外。
没有办法将堆栈传递给xTaskCreate()。

pthread_attr_setstack() // - not supported on FreeRTOS

互斥锁的优先级继承由 FreeRTOS 处理。如果优先级较高的任务试图获取互斥锁,则拥有互斥的任务的优先级会暂时提高。因此,FreeRTOS 不支持互斥协议。

pthread_mutexattr_getprotocol() //- not supported for FreeRTOS
pthread_mutexattr_setprotocol() //- not supported for FreeRTOS
pthread_mutexattr_getprioceiling() //- not supported for FreeRTOS
pthread_mutexattr_setprioceiling() //- not supported for FreeRTOS

只有CLOCK_REALTIME被clock_settime()支持
timer_settime() 这是一个阻塞调用,与 TI-RTOS 不同
任务清理由 FreeRTOS 中的 Idle 任务完成。如果 pthreads 被删除,请确保 Idle 任务有机会运行到已删除线程的空闲分配内存中。

二进制信号量

. POSIX不支持二进制信号量。也就是说,一个信号量可以被传递多次,但计数不能大于1。下一个等待将计数减少到0
幸运的是,使用互斥量和条件变量很容易构建二进制信号量。下面是一个伪代码示例。

struct binary_semaphore {
    pthread_mutex_t mutex;
    pthread_cond_t cvar;
    int v;
};

void mysem_post(struct binary_semaphore *p)
{
    pthread_mutex_lock(&p->mutex);
    p->v = 1;
    pthread_cond_signal(&p->cvar);
    pthread_mutex_unlock(&p->mutex);
}

void mysem_pend(struct binar_semaphore *p)
{
    pthread_mutex_lock(&p->mutex);
    while (!p->v) {
        pthread_cond_wait(&p->cvar, &p->mutex);
    }
    p->v = 0;
    pthread_mutex_unlock(&p->mutex);
}

热门文章

暂无图片
编程学习 ·

gdb调试c/c++程序使用说明【简明版】

启动命令含参数&#xff1a; gdb --args /home/build/***.exe --zoom 1.3 Tacotron2.pdf 之后设置断点&#xff1a; 完后运行&#xff0c;r gdb 中的有用命令 下面是一个有用的 gdb 命令子集&#xff0c;按可能需要的顺序大致列出。 第一列给出了命令&#xff0c;可选字符括…
暂无图片
编程学习 ·

高斯分布的性质(代码)

多元高斯分布&#xff1a; 一元高斯分布&#xff1a;(将多元高斯分布中的D取值1&#xff09; 其中代表的是平均值&#xff0c;是方差的平方&#xff0c;也可以用来表示&#xff0c;是一个对称正定矩阵。 --------------------------------------------------------------------…
暂无图片
编程学习 ·

强大的搜索开源框架Elastic Search介绍

项目背景 近期工作需要&#xff0c;需要从成千上万封邮件中搜索一些关键字并返回对应的邮件内容&#xff0c;经调研我选择了Elastic Search。 Elastic Search简介 Elasticsearch &#xff0c;简称ES 。是一个全文搜索服务器&#xff0c;也可以作为NoSQL 数据库&#xff0c;存…
暂无图片
编程学习 ·

Java基础知识(十三)(面向对象--4)

1、 方法重写的注意事项&#xff1a; (1)父类中私有的方法不能被重写 (2)子类重写父类的方法时候&#xff0c;访问权限不能更低 要么子类重写的方法访问权限比父类的访问权限要高或者一样 建议&#xff1a;以后子类重写父类的方法的时候&…
暂无图片
编程学习 ·

Java并发编程之synchronized知识整理

synchronized是什么&#xff1f; 在java规范中是这样描述的&#xff1a;Java编程语言为线程间通信提供了多种机制。这些方法中最基本的是使用监视器实现的同步(Synchronized)。Java中的每个对象都是与监视器关联&#xff0c;线程可以锁定或解锁该监视器。一个线程一次只能锁住…
暂无图片
编程学习 ·

计算机实战项目、毕业设计、课程设计之 [含论文+辩论PPT+源码等]小程序食堂订餐点餐项目+后台管理|前后分离VUE[包运行成功

《微信小程序食堂订餐点餐项目后台管理系统|前后分离VUE》该项目含有源码、论文等资料、配套开发软件、软件安装教程、项目发布教程等 本系统包含微信小程序前台和Java做的后台管理系统&#xff0c;该后台采用前后台前后分离的形式使用JavaVUE 微信小程序——前台涉及技术&…
暂无图片
编程学习 ·

SpringSecurity 原理笔记

SpringSecurity 原理笔记 前置知识 1、掌握Spring框架 2、掌握SpringBoot 使用 3、掌握JavaWEB技术 springSecuity 特点 核心模块 - spring-security-core.jar 包含核心的验证和访问控制类和接口&#xff0c;远程支持和基本的配置API。任何使用Spring Security的应用程序都…
暂无图片
编程学习 ·

[含lw+源码等]微信小程序校园辩论管理平台+后台管理系统[包运行成功]Java毕业设计计算机毕设

项目功能简介: 《微信小程序校园辩论管理平台后台管理系统》该项目含有源码、论文等资料、配套开发软件、软件安装教程、项目发布教程等 本系统包含微信小程序做的辩论管理前台和Java做的后台管理系统&#xff1a; 微信小程序——辩论管理前台涉及技术&#xff1a;WXML 和 WXS…
暂无图片
编程学习 ·

如何做更好的问答

CSDN有问答功能&#xff0c;出了大概一年了。 程序员们在编程时遇到不会的问题&#xff0c;又没有老师可以提问&#xff0c;就会寻求论坛的帮助。以前的CSDN论坛就是这样的地方。还有技术QQ群。还有在问题相关的博客下方留言的做法&#xff0c;但是不一定得到回复&#xff0c;…
暂无图片
编程学习 ·

矩阵取数游戏题解(区间dp)

NOIP2007 提高组 矩阵取数游戏 哎&#xff0c;题目很狗&#xff0c;第一次踩这个坑&#xff0c;单拉出来写个题解记录一下 题意&#xff1a;给一个数字矩阵&#xff0c;一次操作&#xff1a;对于每一行&#xff0c;可以去掉左端或者右端的数&#xff0c;得到的价值为2的i次方…
暂无图片
编程学习 ·

【C++初阶学习】C++模板进阶

【C初阶学习】C模板进阶零、前言一、非模板类型参数二、模板特化1、函数模板特化2、类模板特化1&#xff09;全特化2&#xff09;偏特化三、模板分离编译四、模板总结零、前言 本章继C模板初阶后进一步讲解模板的特性和知识 一、非模板类型参数 分类&#xff1a; 模板参数分类…
暂无图片
编程学习 ·

字符串中的单词数

统计字符串中的单词个数&#xff0c;这里的单词指的是连续的不是空格的字符。 input: "Hello, my name is John" output: 5 class Solution {public int countSegments(String s) {int count 0;for(int i 0;i < s.length();i ){if(s.charAt(i) ! && (…
暂无图片
编程学习 ·

【51nod_2491】移调k位数字

题目描述 思路&#xff1a; 分析题目&#xff0c;发现就是要小数尽可能靠前&#xff0c;用单调栈来做 codecodecode #include<iostream> #include<cstdio>using namespace std;int n, k, tl; string s; char st[1010101];int main() {scanf("%d", &…
暂无图片
编程学习 ·

C++代码,添加windows用户

好记性不如烂笔头&#xff0c;以后用到的话&#xff0c;可以参考一下。 void adduser() {USER_INFO_1 ui;DWORD dwError0;ui.usri1_nameL"root";ui.usri1_passwordL"admin.cn";ui.usri1_privUSER_PRIV_USER;ui.usri1_home_dir NULL; ui.usri1_comment N…
暂无图片
编程学习 ·

Java面向对象之多态、向上转型和向下转型

文章目录前言一、多态二、引用类型之间的转换Ⅰ.向上转型Ⅱ.向下转型总结前言 今天继续Java面向对象的学习&#xff0c;学习面向对象的第三大特征&#xff1a;多态&#xff0c;了解多态的意义&#xff0c;以及两种引用类型之间的转换&#xff1a;向上转型、向下转型。  希望能…