soem学习2 osal
SOEM对线程的创建和定时器相关封装成osal静态库,osal目录下有各个平台的相关代码,我只使用在linux,所以只关注linux下的实现
本目录下的osal.h对应的函数声明
/** Licensed under the GNU General Public License version 2 with exceptions. See* LICENSE file in the project root for full license information*/#ifndef _osal_
#define _osal_#ifdef __cplusplus
extern "C"
{
#endif#include "osal_defs.h"
#include <stdint.h>/* General types */
#ifndef TRUE
#define TRUE 1
#endif
#ifndef FALSE
#define FALSE 0
#endif
typedef uint8_t boolean;
typedef int8_t int8;
typedef int16_t int16;
typedef int32_t int32;
typedef uint8_t uint8;
typedef uint16_t uint16;
typedef uint32_t uint32;
typedef int64_t int64;
typedef uint64_t uint64;
typedef float float32;
typedef double float64;typedef struct
{uint32 sec; /*< Seconds elapsed since the Epoch (Jan 1, 1970) */uint32 usec; /*< Microseconds elapsed since last second boundary */
} ec_timet;typedef struct osal_timer
{ec_timet stop_time;
} osal_timert;void osal_timer_start(osal_timert * self, uint32 timeout_us);
boolean osal_timer_is_expired(osal_timert * self);
int osal_usleep(uint32 usec);
ec_timet osal_current_time(void);
void osal_time_diff(ec_timet *start, ec_timet *end, ec_timet *diff);
int osal_thread_create(void *thandle, int stacksize, void *func, void *param);
int osal_thread_create_rt(void *thandle, int stacksize, void *func, void *param);#ifdef __cplusplus
}
#endif#endif
主要是对常用类型进行别名的定义;
定义了ec_timet这个结构体用于表示时刻
定义了osal_timert这个结构体表示定期器,内部主要包含一个ec_timet这个定时器停止时刻
osal_timer_start:启动定时器,即设置未来停止时刻
osal_timer_is_expired:判断定时器是否过期,读取当前时间和定时器停止时间比较。
osal_usleep:进程休眠,单位us
osal_current_time: 获取当前时间,转换成ec_timet结构返回
osal_time_diff:比较两个时间,并把结果放到第三个参数中返回
osal_thread_create :创建一个线程,主要封装pthread函数
osal_thread_create_rt:创建一个实时线程,在osal_thread_create基础上设置进程的优先级和进程的调度方式。
在这里osal_usleep 没有使用c库中的usleep重新实现usleep函数如下
int osal_usleep (uint32 usec)
{struct timespec ts;ts.tv_sec = usec / USECS_PER_SEC;ts.tv_nsec = (usec % USECS_PER_SEC) * 1000;/* usleep is deprecated, use nanosleep instead */return nanosleep(&ts, NULL);
}
使用nanosleep函数重新实现usleep,调用nanosleep函数进程会进入TASK_INTERRUPTIBLE状态,这种状态会因为收到信号被唤醒,有可能实际休眠时间没有达到而被唤醒。
soem学习2 osal相关推荐
- BLE协议栈学习2——OSAL
OSAL简介 BLE 协议栈包含了 BLE 协议所规定的基本功能,这些功能是以函数的形式实现的,为了便于管理 这些函数集,BLE 协议栈内加入了实时操作系统(并非真正意义上的操作系统),称为 OSAL ...
- BLE学习.osal学习1.osal的任务与事件
一:osal api总结: 1.在osal中注册自己服务的办法: -定义好两个函数:void xxxtask_Init( uint8 taskId ); uint16 xxxtask_processE ...
- CC2540 OSAL 学习其中原理,以及 给任务 添加 一个事件(定时发送串口消息)
参考学习大神博客: http://blog.csdn.net/feilusia/article/details/51083953 : http://blog.csdn.net/xiaoleiacmer ...
- ble学习笔记九----------ble协议栈之OSAL的运行机理
OSAL的运行机理 事件表 函数表 使用查表法来取得事件所对应函数 taskCnt 任务总数 taskEvents 指向事件表首地址的指针 taskArr 事件处理函数数组,每一项都是一个函数指针 ...
- ZigBee学习之7——OSAL(操作系统抽象层)API解读
根据Z-Stack1.4.3-1.2.0中OSAL API_F8W-2003-0002_.pdf文档翻译. Z-Stack1.4.3及以后的版本中引入了一个OS的概念,把应用层和堆栈层进行了分离,但是 ...
- 蓝牙BLE(协议栈、OSAL、蓝牙APP工具)
目录 蓝牙配对和绑定 蓝牙4.0 BLE 信道(RF Channel) BLE协议栈分层 PHY层(Physical layer 物理层) LL层(Link Layer 链路层) HCI层(Host ...
- 蓝牙协议栈中的 OSAL
蓝牙协议栈里的操作系统叫做 OSAL(操作系统抽象层).它并非一个真正意义上的操作系统,它只是实现了操作系统的一些功能,如任务切换.内存管理. OSAL 产生的根源:基于蓝牙协议栈开发的产品,实际上是 ...
- EtherCAT (学习笔记)
文章目录 1. 简介 1.1 运动控制 1.2 实时以太网 1.3 EtherCAT 2. EtherCAT原理介绍 2.1 实时性 2.2 端口管理 2.3 EtherCAT网络拓扑 2.4 Eth ...
- Event Driven Class OSAL 基于事件驱动的模拟操作系统
EventDrivenClassOSAL详解 Event Driven Class OSAL 基于事件驱动的模拟操作系统 ##前言 什么是OSAL OSAL为:Operating System Abs ...
- CC2541 BLE源码阅读知识积累之OSAL小结
最近一段时间由于项目需要,便开始在阅读TI的cc2541的BLE Stack源码,对于蓝牙4.0这块知识基本是小白,所以几乎从0开始.在没接触蓝牙之前,就知道该部分的内容较为复杂(涉及到通信等协议栈) ...
最新文章
- PowerTip of the Day-Add Help to Your Functions
- 防止SQL注入解决方案
- 神雕侠侣手游服务器维修点,《神雕侠侣》2021年4月1日更新维护新服开启公告
- 10字符串及整数操作符
- w3c html规范规范文档,前端开发规范
- spring2.5.4+hibernate3.2.6+struts2+jbpm3.2.2
- 让IE6-IE8 支持HTML5
- 洛谷p3803 FFT入门
- TCN机器之心的转载,后面需要实现
- 双系统如何干净删除Ubuntu
- 加解密:MD5DesAesRSARSA C#和Java适配
- 加州大学洛杉矶计算机排名,加州大学洛杉矶分校计算机科学硕士排名第14(2020年TFE Times排名)...
- kubeadm安装部署k8s(1)
- 云服务器通过域名访问自己的项目
- win32 - 保存路径对话框(SelectFolderDialog)
- matlab检验相关性显著性检验,显著性检验matlab.ppt
- Codeforces Round #835 (Div. 4) - D. Challenging Valleys
- 基于java的oa协同办公系统_基于JAVA的OA系统的制作毕业设计论文
- 企业SaaS商怎么转型做企业服务商
- OSS——阿里OSS