有些长期习惯在单片机中实现程序裸跑的程序员并不了解实时操作系统,在初次使用aworks实时操作系统及例程时无从下手。就此问题,本文介绍在aworks操作系统下的can例程使用。
aworks简介
aworks是zlg开发的iot物联生态系统,aworks生态系统主要包括三个方面:硬件平台、os、云,如图1.1所示。
图1.1 aworks生态系统
aworks os作为生态系统的核心,为客户提供了多任务、信号量、shell、消息队列、消息邮箱等服务,还包含了大量丰富的组件,例如:modbus、tcp/ip、gui、can、多媒体等。
1、多任务服务
在aworks中可以使用裸跑的方式进行程序编写,但随着系统逐渐庞大时,单一的循环会使逻辑变得复杂而且也不能体现aworks的优越性能,极大的增加了维护和扩展系统的难度,因此应用程序使用多任务管理时,可使程序简单明了,如程序清单1.1 所示。
程序清单1.1 创建can的任务
使用任务管理时首先创建任务,创建任务步骤主要分为三步:1.定义任务实体,2.初始化任务,3.启动任务。
定义任务实体:主要为任务分配必要的内存空间,在aworks中可定义动态和静态任务实体,函数原型如程序清单1.2所示。
程序清单1.2 定义任务相关宏
task是任务实体名,stack_size指定为该任务分配的栈空间大小。
初始化任务:定义任务实体后需要初始化,在aworks中提供了初始化任务实体的接口,原型如程序清单1.3所示。
程序清单1.3任务初始化
启动任务:任务初始化完成后可启动任务,进入入口函数执行任务代码,函数原型如程序清单1.4所示。
程序清单1.4 启动任务
终止任务:当一个任务处理完成后不会再调用该任务时,可以将此任务释放终止,用于节省系统资源,原型如程序清单1.5所示。
程序清单1.5 终止任务
2、信号量
信号量是一种轻型的用于解决任务间同步问题的内核对象,任务可以获取或者释放它,从而达到同步或互斥的目的,在aworks中定义了三种类型的信号量:互斥信号量、二进制信号量、计数信号量,常用的为互斥信号量和二进制信号量。
互斥信号量:用于任务间对资源的互斥访问,在一个任务使用共享资源前获取互斥信号量,在使用共享资源结束后,释放互斥信号量,任务以独占的方式使用共享资源,互斥信号量相关的宏如程序清单1.6所示。
程序清单1.6 互斥信号量相关宏
sem:互斥信号量实体的标识名;
timeout:超时时间;
options:互斥信号量选项,如表1所示。
二进制信号量:二进制信号量也可用于实现共享资源的互斥访问,即在同一个任务中获取(使用共享资源前)和释放(使用共享资源后)信号量,但其不支持在任务内递归使用,当任务获取到信号量时,若没有释放,则在该任务内继续获取信号量时,将会获取失败,对于互斥信号量,只要任务成功获取到互斥信号量,后续在该任务内继续获取互斥信号量时,将会直接获取成功,二进制信号量相关的宏如程序清单1.7所示。
程序清单1.7 二进制信号量相关宏
sem:二进制信号量实体的标识名;
initial_state:指定初始状态,有效值为1,无效为0;
options:二进制信号量选项,同互斥信号量一样;
timeout:超时时间;
通常当需要任务间互斥访问某一共享资源时,建议都使用互斥信号量,互斥信号量和二进制信号量都只有两种状态:有效(1),无效(0)。
二进制信号量可以用于任务间的同步,即:一个任务仅获取信号量,另一个任务仅释放信号量。
互斥信号量只能使用于任务间的互斥,即:只能在同一任务中获取和释放互斥信号量,不能由一个任务获取互斥信号量,另外一个任务释放互斥信号量。
3、消息队列
消息队列用于任务间消息的传输,可以存放多条消息,发消息的任务负责将消息发送至队列,接收消息的任务负责从队列中提取消息,消息队列相关的宏如程序清单1.8所示。
程序清单1.8 消息队列相关宏
msgq:消息队列实体的标识名
msg_num:消息最大条数
msg_size:每条消息大小
options:消息队列选项,即先进先出/优先级排队方式
p_buf:获取消息后,消息存储区
nbytes:指定缓冲区大小,必须能够容纳一条消息
timeout:超时时间
priority:消息优先级
can接口配置
由于can总线的高效率、高可靠性、低成本等特点,can总线已被已被广泛应用于各电子领域。
在aworks中已将can总线通讯做了完善的处理,预留了丰富的接口供用户使用,用户无需进行can总线底层代码的编写,只需调用接口实现功能逻辑抓取数据即可,方便用户快速使用can总线,预留接口部分如图2.1所示。
图2.1 can预留接口
更多接口可以参考aworks标准api参考手册v1.01。
1、can配置
每一个外设在aworks中都有对应例程,比如gps、gprs、can、iic、lcd、rtc等,用户可自行上官网自行下载sdk包,demo_can.c在sdk包examplesperipheralcommoncan目录下,将例程文件加入到工程后进行can的配置,步骤如下:
外设使能
在工程文件中有一个工程参数配置文件:aw_prj_params.h,可在该文件里进行硬件裁剪、组件裁剪、资源配置等,在m1052核心板中提供两路can供客户使用,此处使能can1,程序清单如2.1所示。
程序清单2.1 can1使能
硬件参数配置确认
can1硬件参数配置文件在工程目录user_configwbl_hwconf_usrcfgwbl_hwconf_imx1050_flexcan1.h下,硬件参数包含了can所使用的引脚、接收数据大小等,最终由一个结构体将数据打包传入底层,原型如程序清单2.2所示。
程序清单2.2 硬件设备信息
应用程序
在外设使能完成、硬件配置参数确认完成后,查看demo_can.c应用程序,部分代码如程序清单3.1所示。
程序清单3.1 部分代码
在程序清单3.1中,使用了任务管理、互斥信号量、消息队列实现数据的自发自收,程序中概念可参考aworks简介下的多任务服务、信号量、消息队列小节。
软硬件连接与软件设置
1、硬件连接
本例程所用产品由广州致远电子电子有限公司制造,开发板型号:m105x-ev-board,can分析仪:usbcan-2e-u,信号转换器:ap-uart-can,如图4.1所示。
图4.1 硬件图
实物连接图如图4.2所示。
图4.2 实物连接图
如图4.2所示,硬件线路连接在图中已经标出,选用ap-uart-can是因为m105x-ev-board开发板中没有can信号隔离收发器,因而需要外接can信号隔离收发器。
其中can分析仪有两路can通道——can0和can1,ap-uart-can信号转换器具有7路串口(4路485和3路232)和2路can电气隔离信号转换通道。
2、软件配置
在连接完成硬件后,配置can数据收发软件,图中所用工具为cantest,如图4.3所示,可以在官网自行搜索下载。
图4.3 cantest
打开cantest默认选择确认,如需修改,客户自行选择,如图4.4所示。
图4.4 cantest启动界面
完成启动后选择设备,如图4.5所示,点击左上角选择设备,会出现一串设备列表信息,选择usbcan-2e-u,如果是其他设备,则选择对应设备名称,zlg致远电子所有的can分析仪都被包含在该列表里。
图4.5 选择设备信息
完成设备选择后,自动弹出打开设备选项,默认设备索引号0,选择can通道0,波特率500k,如有不同用户自行修改,点击确定,如图4.6所示。
图4.6 通讯参数设置
点击确定并启动can,会自动弹出滤波设置,选择默认即可,无需滤波,如需要滤波设置,自行选择滤波模式以及滤波帧,如图4.7所示。
图4.7 滤波设置
默认选择接收所有数据,点击确定,cantest软件配置完成,可在基本操作处设置要发送的数据,显示界面如图4.8所示。
图4.8 配置完成界面
在软硬件设置完成后,将代码下载到开发板中,设置帧id为0x00000001,发送数据为aa 01 02 03 04 05 06 07,接收结果如图4.9所示。
图4.9 发送接收结果
在图4.9中可见,数据发送与接收一致。在aworks中使用使用can通讯,只需调用预留接口、配置些许参数、连接硬件设置软件即可获取数据,省去了调试大量can参数的时间(如波特率配置),而使用优先级、信号量、消息队列可以保证在使用can时数据不被其他任务数据干扰。