TencentOs Tiny 学习日志-AT框架 2019_12_30_02

news/2024/10/23 9:27:40/

通过看TencentOs tiny github附带的API源码学习课程,竟然还有视频终于都AT框架的实现有更彻底的认识,如果要明白SAL层和AT框架如何与模组进行同步异步通信的必须学习两个知识,信号量和互斥锁。

信号量和互斥锁的原理百度千篇一律,我从视频和博客针对TencentOS tiny源码的分析,对信号量和互斥锁才是彻底掌握。

我以以下tencentOs里AT框架源码解释一下互斥锁,我们最关心的就是AT框架如何利用AT指令与模组进行通信,这里AT框架提供两个发指令API:

1) tos_at_cmd_exec 发送一条指令,取得串口所有权后,发送完即返回

2)tos_at_cmd_exec_until  发送一条指令,直到捡到期望值echo对象后才返回

先从tos_at_cmd_exec解释起,这个API只用到了互斥锁,就是在获取uart口这个临界资源时,tos_mutex_pend获取锁,当获取不到时任务则被挂起等待其他任务释放互斥uart锁,当代码能继续往下运行代码已经获取到uart锁了,当数据发送出去后,任务at_parser及时处理模组串口指令回复,赋值给echo对象,达到同步效果,通过互斥锁的挂起,实现代码看似顺序执行,无需等待即拿到模组串口指令回复。

附带tos_at_cmd_exec接口源码:

__API__ int tos_at_cmd_exec(at_echo_t *echo, uint32_t timeout, const char *cmd, ...)
{int ret = 0;va_list args;if (echo) {at_echo_attach(echo);}va_start(args, cmd);ret = at_cmd_do_exec(cmd, args);va_end(args);if (ret != 0) {AT_AGENT->echo = K_NULL;return -1;}tos_task_delay(tos_millisec2tick(timeout));AT_AGENT->echo = K_NULL;return 0;
}

tos_at_cmd_exec_until这个API较为不同的是它必须收到模组串口回复的值与事先创建的echo对象,echo对象相关知识可以看腾讯云大学有一个视频是介绍TencentOs tiny的,里有介绍AT框架特别是echo对象含义。

比如发送一串网络数据出去,我们期望得到send ok才认为数据发送出去(实际移远模组send ok只是代表模组收到了需要发送的数据还不代表服务器收到),TencentOS tiny源码是先创建一个信号量tos_sem_create(&echo->__expect_notify, 0)创建一个初始值为0的信号量,也就是说必须有地方post释放一个信号量才能被获取,创建信号量后,跟tos_at_cmd_execAPI一致等拿到uart口资源后发送数据,然后不同之处来了,会去获取刚才创建的的信号量tos_sem_pend(&echo->__expect_notify, tos_millisec2tick(timeout)),这是任务被挂起,直到任务at_parser解析数据然后释放,这时才获取到期待返回的值,TencentIOS TINY这种处理使用了系统的资源互斥锁和信号量,针对这个我之前是用队列去解决这一问题,队列来控制串口的所有权,当然TencentOS tiny更是大众的写法也更好,后续打算替换到已经在开发的项目,实现代码编程技术提升。

以下tos_at_cmd_exec_until源码:

__API__ int tos_at_cmd_exec_until(at_echo_t *echo, uint32_t timeout, const char *cmd, ...)
{int ret = 0;va_list args;if (!echo || !echo->echo_expect) {return -1;}if (tos_sem_create(&echo->__expect_notify, 0) != K_ERR_NONE) {return -1;}echo->__is_expecting = K_TRUE;at_echo_attach(echo);va_start(args, cmd);ret = at_cmd_do_exec(cmd, args);va_end(args);if (ret != 0) {AT_AGENT->echo = K_NULL;return -1;}if (tos_sem_pend(&echo->__expect_notify, tos_millisec2tick(timeout)) != K_ERR_NONE) {ret = -1;}tos_sem_destroy(&echo->__expect_notify);AT_AGENT->echo = K_NULL;return ret;
}

 

分享杰杰大神的的博客https://blog.csdn.net/jiejiemcu/article/details/100056641。

 


http://www.ppmy.cn/news/414529.html

相关文章

华大单片机移植TencentOS

华大单片机移植TencentOS-Tiny 文章目录 华大单片机移植TencentOS-Tiny一、参考链接:二、资料准备三、开始移植四、移植完成-测试五、总结 一、参考链接: 1.Tiny的有关概述我就不说了。直接上官网看就可以了。 2.(1)TencentOs官网 (2)其他参考链接:杰…

TencentOS 3.1下安装gitlab服务器

TencentOS 3.1大致跟CentOS 8.2功能兼容,内核升级到5.4.11 公司要求在这个环境下搭建一台gitlab服务器。 找了一大圈发现没有可用的rpm安装包。大量的资源师CentOS 7的。可能是CentOS 8停止维护后的后遗症。 换了个思路,在腾讯云上找资源。果然有结果。 云服务器 搭建 Gi…

手机里tencent文件夹能删吗_手机SD卡Tencent文件夹里面哪些可以删?

展开全部 手机内存卡里tencent是腾讯QQ软件建立、存放数据的文件夹,32313133353236313431303231363533e59b9ee7ad9431333365633835如果用户需要继续使用QQ,不建议随意删除。 QQ浏览器的文件并不在这个文件夹内,所以它的体积一般不会很大。 但…

腾讯物联TencentOS tiny上云初探

2017年中旬曾写过一篇关于物联网平台的文章《微软最完善,百度最“小气” 看微软阿里百度三大物联网云平台对比》。现在已经过去两年了,物联网的格局又发生了不少的变化。不过针对腾讯来说,其物联网平台发轫的时间绝不算晚,基本就是…

手机里tencent文件夹能删吗_手机上的文件夹能不能删?看完之后秒懂

原标题:手机上的文件夹能不能删?看完之后秒懂 不知道你发现没有,在手机上有很多英文文件夹,光看文件名不知道是什么意思,很多都是打开之后才知道里面是放着什么东西。 在手机内存不足的时候,很多人会选择删…

TencentOS tiny RTOS快速入门

上节,我们介绍了TencentOS tiny,参考官方给出的移植教程亲自动手做了一遍,文章如下: 天啊!鹅厂都开始做开发板了?网红腾讯物联网开发板终极开箱评测,让我们一睹为快! 趁着最近有时间,这节,我撸了几个例程作为后面做项目参考的基本框架,当然也有一些是直接拿了官方文档…

TencentOS 3.1安装MySQL 8.0.32

到官网下载安装包:https://dev.mysql.com/downloads/mysql/ 使用如下命令解包。 tar xf mysql-8.0.32-1.el8.x86_64.rpm-bundle.tar 使用rpm -qa |grep mysql 和rpm -qa |grep mariadb检查是否安装过mysql 如果有,使用下命令移除: rpm -e …

TencentOS Server安装Docker

今天在TencentOS Server3服务器上安装Docker时遇到了一些问题,在此记录一下。 根据腾讯云官方文档中所述,从Docker官方文档中安装,期间存在报错,以下将过程列出。 1.卸载旧版本 旧版本的 Docker 被称为docker或docker-engine. …