成都高端网站制作公司,茶叶网站程序,加强,网络高清播放器如何安装目录简介TI-RTOSFreeRTOSPOSIX运行时对象查看器 (Runtime Object Viewer)TI-POSIX 介绍在源代码中使用 POSIXTI-POSIX支持的函数摘要线程函数调用的前后关系线程管理线程属性线程同步障碍属性条件变量条件变量属性互斥锁互斥属性读写锁定读写锁属性辅助函数调用的前后关系时钟消…
目录简介TI-RTOSFreeRTOSPOSIX运行时对象查看器 (Runtime Object Viewer)TI-POSIX 介绍在源代码中使用 POSIXTI-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-RTOSMSP432™ 和 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.hvoid *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.hTI-POSIX支持的函数摘要
在实时操作系统前后关系中有三种前后关系: main 在main()函数中在调用RTOS调度器之前 task 在本地RTOS线程中(即不是从pthread中) interrupt 在中断服务程序中
线程函数调用的前后关系
线程管理
函数名用途maintaskpthread_cancel向线程发送取消请求NoYespthread_cleanup_pop弹出线程取消清理处理程序NoYespthread_cleanup_push推取消线程清理处理程序NoNopthread_create创建一个新线程YesYespthread_detach分离一个线程NoYespthread_equal比较线程 idYesYespthread_exit终止调用线程NoNopthread_getconcurrency不支持pthread_getcpuclockid不支持pthread_getschedparam用于获取 pthread 的优先级NoYespthread_getspecific获取调用线程的线程特定数据NoNopthread_join用终止线程连接NoYespthread_key_create创建特定于线程的数据键NoNopthread_key_delete删除线程特定的数据键NoNopthread_once运行一次初始化例程NoYespthread_self获取调用线程的 IDNoNopthread_setcancelstate设置取消能力状态和类型NoNopthread_setcanceltype不支持。只支持异步取消pthread_setconcurrency不支持pthread_setschedparam用于设置线程的优先级NoNopthread_setschedprio不支持。使用 pthread_setschedparam 来设置优先级pthread_setspecific设置调用线程的线程特定数据NoNopthread_testcancel不支持
线程属性
函数名用途maintaskpthread_attr_destroy销毁线程属性对象YesYespthread_attr_getdetachstate获取属性对象中的分离状态YesYespthread_attr_getguardsize获取属性对象中的保护大小YesYespthread_attr_getinheritsched不支持的内核调度策略是固定的pthread_attr_getschedparam获取属性对象中的调度参数YesYespthread_attr_getschedpolicy不支持的内核调度策略是固定的pthread_attr_getscope不支持的内核没有进程的概念pthread_attr_getstack获取堆栈大小和地址属性YesYespthread_attr_getstacksize获取属性对象中的堆栈大小YesYespthread_attr_init初始化线程属性YesYespthread_attr_setdetachstate在属性对象中设置分离状态YesYespthread_attr_setguardsize在属性对象中设置保护大小YesYespthread_attr_setinheritsched不支持的内核调度策略是固定的pthread_attr_setschedparam在属性对象中设置调度参数YesYespthread_attr_setschedpolicy不支持的内核调度策略是固定的pthread_attr_setscope不支持的内核没有进程的概念pthread_attr_setstack设置堆栈大小和地址YesYespthread_attr_setstacksize设置堆栈大小YesYes
线程同步
函数名用途maintaskpthread_barrier_destroy摧毁一个障碍物YesYespthread_barrier_init初始化一个障碍物体YesYespthread_barrier_wait在屏障处同步NoYes
障碍属性
函数名用途maintaskpthread_barrierattr_destroy破坏 barrier 属性对象YesYespthread_barrierattr_getpshared不支持的内核没有进程的概念pthread_barrierattr_init初始化 barrier 属性对象YesYespthread_barrierattr_setpshared不支持的内核没有进程的概念
条件变量
函数名用途maintaskpthread_cond_broadcast取消阻止条件变量上阻塞的所有线程NoYespthread_cond_destroy为条件变量分配的可用资源YesYespthread_cond_init分配和初始化条件变量YesYespthread_cond_signal取消阻止等待条件变量的线程NoYespthread_cond_timedwait使用超时等待条件变量NoYespthread_cond_wait等待条件变量NoYes
条件变量属性
函数名用途maintaskpthread_condattr_destroy销毁条件变量属性对象YesYespthread_condattr_getclock不支持pthread_condattr_getpshared不支持pthread_condattr_init初始化条件变量属性对象YesYespthread_condattr_setclock不支持pthread_condattr_setpshared不支持
互斥锁
函数名用途maintaskpthread_mutex_destroy为互斥对象分配的自由资源YesYespthread_mutex_getprioceiling获取互斥锁的优先级上限YesYespthread_mutex_init分配和初始化互斥对象YesYespthread_mutex_lock锁定互斥锁NoNopthread_mutex_setprioceiling设置互斥锁的优先级上限NoYespthread_mutex_timedlock等待带超时的互斥对象NoNopthread_mutex_trylock锁定一个互斥锁如果它是可用的不阻塞返回NoNopthread_mutex_unlock解锁调用线程拥有的互斥对象NoNo
互斥属性
函数名用途maintaskpthread_mutexattr_destroy销毁互斥属性对象YesYespthread_mutexattr_getprioceiling获取互斥锁属性对象的优先级上限YesYespthread_mutexattr_getprotocol获取互斥锁属性对象的协议YesYespthread_mutexattr_getpshared不支持pthread_mutexattr_gettype获取互斥类型属性YesYespthread_mutexattr_init初始化互斥属性对象YesYespthread_mutexattr_setprioceiling设置互斥对象的优先级上限YesYespthread_mutexattr_setprotocol设置互斥锁属性对象的协议YesYespthread_mutexattr_setpshared不支持pthread_mutexattr_settype设置互斥类型属性YesYes
读写锁定
函数名用途maintaskpthread_rwlock_destroy销毁一个读写锁对象YesYespthread_rwlock_init初始化一个读写锁对象YesYespthread_rwlock_rdlock锁定读写锁对象进行读取NoNopthread_rwlock_timedrdlock锁定一个读写锁对象用于超时读取NoNopthread_rwlock_timedwrlock使用超时锁定写入的读写锁定NoNopthread_rwlock_tryrdlock尝试读写锁以进行读取(非阻塞)NoNopthread_rwlock_trywrlock尝试使用读写锁进行写入(非阻塞)NoNopthread_rwlock_unlock解锁一个读写锁对象NoNopthread_rwlock_wrlock锁定一个读写锁对象进行写入NoNo
读写锁属性
函数名用途maintaskpthread_rwlockattr_destroy销毁读写锁属性对象YesYespthread_rwlockattr_getpshared不支持pthread_rwlockattr_init初始化读写锁属性对象YesYespthread_rwlockattr_setpshared不支持
辅助函数调用的前后关系
时钟
函数名用途maintaskclock_gettime获取当前时间YesYesclock_nanosleep高分辨率睡眠可指定时钟NoYesclock_settime为CLOCK REALTIME时钟设置当前时间YesYes
消息队列
函数名用途maintaskmq_close关闭消息队列YesYesmq_getattr获取消息队列属性YesYesmq_open打开一个消息队列YesYesmq_receive从消息队列接收消息NoYesmq_send向消息队列发送消息NoYesmq_setattr设置消息队列属性YesYesmq_timedreceive接收来自消息队列的消息带有超时NoYesmq_timedsend使用超时向消息队列发送消息NoYesmq_unlink删除消息队列YesYes
信号量
函数名用途maintasksem_destroy销毁一个信号量YesYessem_getvalue获取信号量计数YesYessem_init初始化信号量YesYessem_post解锁一个信号量(即增加信号量计数)YesYessem_timedwait带超时锁定信号量NoYessem_trywait尝试锁定信号量(非阻塞)NoYessem_wait锁定信号量NoYes
睡眠
函数名用途maintasknanosleep高分辨率睡眠NoYes
计时器
函数名用途maintasktimer_create创建一个计时器YesYestimer_delete删除计时器YesYestimer_gettime获取计时器到期之前的时间YesYestimer_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);
}