玩过TI 的ZigBee或者BLE的人,都会接触到OSAL。OSAL是什么?OSAL英文全称:operating system abstraction layer(操作系统抽象层)。基于OSAL的调度机制,OSAL支持多任务,而且一个任务内支持多个事件执行。有关OSAL调度机制的实现原理,可以去网上搜索资料。在OSAL下,我们就可以把对数据或者单片的操作转化成各种任务,各种事件,真正做到有条不紊。和较为复杂UCOS系统比起来,OSAL实现起来比较简单,其核心也只是做一些任务的轮询调度。OSAL占用空间3K左右,特别适用51单片机。  我们初玩51单片机,基本上在裸机上跑程序,效率高,实现的功能的比较简单。但是,对于复杂的功能,就不适合在裸机上跑了,效率不高,而且可能会严重限制单片机的运行速度。比如多次检测多个按键,每次消抖处理都要用delay()函数做延时,delay函数本身就挺占用cpu资源。如果还有其他周期性事件要执行,因为delay函数占用cpu资源,同样会导致周期事件没法在规定的时间内执行。所以还是很有必要跑系统,再在系统的平台上运行我们的应用程序。
  本文简要介绍OSAL的在STC8A8K64S4A12移植的过程,并且以几个任务事件做测试。本工程文件也会上传到附件中,需要的可以去下载。
一、移植OSAL所需主要文件
<ignore_js_op>

OSAL.c这个文件主要有事件创建和删除、就绪任务轮询、消息创建和任务创建初始化等;OSAL_ClockBLE.c这个文件主要有系统任务事件时间更新、日期的转化、日期的初始化等;OSLA_Memory.c这个文件主要是一些内存的管理、OSAL堆空间的分配等;OSAL_Timer.c这个文件主要是事件定时执行、事件终止等。
二、移植关键部分
1、数据类型的定义
<ignore_js_op>

数据类型的定义需要根据不同单片机的数据类型长度来定义,本文是根据STC8A8K64S4A12的数据长度的定义数据类型。如果不清楚自己的单片机的数据类型的长度,可以用sizeof()函数得到数据类型长度,比如sizeof(int)。
2、OSAL时间更新
<ignore_js_op>

这个函数里面调用到两个函数,osalTimerUpdate(1)主要是让系统的时基增加1ms,要求每次过了1ms都要调用这条函数,事件的定时执行的时间计算都是基于这个累计的时基;osalClockUpdate(1)这个函数主要是累计1ms的时间,方便把时间转化为年月日。我这边是使用STC8A8K64S4A12的定时器0外设产生1ms的定时器0中断,然后把void osalTimeUpdate(void函数要放在定时器0中断处理函数中,这样每次产生中断,就会更新1ms的时基。
<ignore_js_op>

3、中断临界保护
<ignore_js_op>

OSAL在对内存的管理和任务的轮询等关键操作需要先关闭系统总中断,操作完后,再把系统总中断打开。OSAL在多个地方都有使用到中断临界保护,可以保护关键操作时数据不被外部中断干扰。查询到STC8A8K64S4A12对系统总中断真正的开启和关闭需要执行EA=0/EA=1后再延长1-2个指令周期,所以加上两条asm("nop")语句,确保系统总中断绝对的关闭或者打开。
三、OSAL的使用
1、main()函数
<ignore_js_op>

main函数就只需要包含四条语句,十分简洁。其中定时器0初始化,产生1ms的中断,更新系统时基;初始化系统任务,开启系统总中断,启动任务轮询。然后系统就能跑起来了。
2、OSAL启动系统
<ignore_js_op>

从for循环语句知道,死循环执行osal_run_system()函数。这个函数主要是不停地轮询哪些任务就绪,然后执行就绪任务。
3、用户自定义任务
<ignore_js_op>

tasksAtrr[]这个是存放用户自定义应用任务的数组,这里只定义一个应用任务。可以自定义多个自定义任务,任务轮询就是查询这个数组里面任务有哪些事件需要执行。
4、系统初始化
<ignore_js_op>

这里是做一些应用的初始化,在初始化函数里面,用户可以设置哪些事件执行。
5、任务事件处理
<ignore_js_op><ignore_js_op>

上面的图片就是任务里面的事件,任务在被轮询的时候,就会查询哪些事件就绪,一旦某个事件就绪,就去执行对应事件处理,处理完后,会清除对应事件就绪标志,确保对应事件不会被重复执行。下面的图片是事件位域的定义,一个任务支持定义16个事件。
6、几事件设置的函数
<ignore_js_op> 
7、OSAL堆空间大小设置
<ignore_js_op>

INT_HEAP_LEN是OSAL运行的堆空间设置,这里设置为1024,如果用户的任务和事件比较多的话,就要适当加大对空间的大小。
四、任务事件执行演示
<ignore_js_op>    <ignore_js_op><ignore_js_op>

<ignore_js_op>

采用外部中断来实现按键中断,再设置20ms按键消抖检测事件,一旦按键有效,就定时启动6个事件,事件的处理就是让特定的GPIO口电平反转。按下按键后,从逻辑分析仪,可以清楚地看到6个事件的执行过程,看起像是并行处理事件,其实是串行处理事件的。
<ignore_js_op>

再次按下按键后,所以事件都被停止了。再次按下后,事件有开始执行了,交替按下按键,再用逻辑分析仪查看。
<ignore_js_op> 
工程全部文件
<ignore_js_op> 
实物图
<ignore_js_op>

全部资料51hei下载地址:
<ignore_js_op> STC8A8K64S4A12.rar (502.18 KB, 下载次数: 3)

IAR平台移植TI OSAL到STC8A8K64S4A12单片机中的更多相关文章

  1. 在IAR平台建立STC8ASK64S4A12单片机工程

    转载:http://www.51hei.com/bbs/forum.php?mod=viewthread&tid=168481&page=1#pid737250  一般我们使用STC单 ...

  2. Lua在单片机中的移植

    Lua代码符合ANSI C标准,只要有C编译器的开发环境就能跑Lua. 虽说只要有C编译器就能跑Lua,但是单片机的环境太简单,有些C标准的内容仍旧无法支持. Lua的官网是:www.lua.org ...

  3. MIPS平台移植apache 2.2.7

    参考文章: http://wenku.baidu.com/view/94e08a20a5e9856a561260e2.html http://httpd.apache.org/docs/2.4/ins ...

  4. php平台移植windows和linux

    2015/1/14 今天项目中遇到一个问题,在本地运行没有问题,挂到服务器上,就运行错误.过程中比较粗心,知道导致这样的原因,居然小时漏掉了一些细节. 比如,在php中通过声明__autoload() ...

  5. 只能用Android studio做平台移植了! 在Windows10下, 开发Android。

    安装好IDE后, 会一直显示同步失败, 看看如下步骤: 需要注意的是: -> 安装NDK      自带的NDK版本有问题    自己去下一个15版本的 -> 按照系统提示一步一步安装其他 ...

  6. IAR 9+ 编译 TI CC2541 出现 Segment ISTACK (size: 0xc0 align: 0) is too long for segment definition.

    IAR 9+ 编译 TI CC2541 出现 Segment ISTACK (size: 0xc0 align: 0) is too long for segment definition. Segm ...

  7. 异数OS国产CPU平台移植项目需求分析

    异数OS国产CPU平台移植项目需求分析 目录 异数OS国产CPU平台移植项目需求分析 项目立项背景 项目需求分析 异数OS性能指标简介 1.TCP协议栈性能测试 2.异数OS-织梦师-水母 消息队列性 ...

  8. 一种单片机支持WiFi的应用——SimpleWiFi在单片机中的应用

    一种单片机支持WiFi的应用——SimpleWiFi在单片机中的应用 先上图: 现在的智能控制都是基于微控制器,随着智能的手持终端的普及,基于智能终端的控制就会越来越普遍. WIFI便是其中的一种.W ...

  9. 为什么单片机中既有Flash又有EEPROM

    单片机运行时的数据都存在于RAM(随机存储器)中,在掉电后RAM 中的数据是无法保留的,那么怎样使数据在掉电后不丢失呢?这就需要使用EEPROM 或FLASHROM 等存储器来实现. 插播一段:ROM ...

随机推荐

  1. 开始使用 Ubuntu(字体渲染去模糊+软件安装+优化配置+常见错误)(29)

    1. 中文字体渲染美化 + 去模糊 步骤: 1. 解压安装 lulinux_fontsConf_181226.tar.gz,按里面的安装说明操作: 2. 开启字体渲染: 打开 unity-tweak- ...

  2. QT 创建本地数据库(SQLite数据库)存储数据

    注意:QT自带SQLITE数据库,不需要再安装 1.创建一个包含创建.查询.修改和删除数据库的数据库类(DataBase) DataBase.h头文件 #pragma once #include &l ...

  3. 用jquery和php实现ajax异步请求响应

    ajax技术可以实现异步请求和响应,下面的是用jquery向一个php脚本发送异步请求,并得到响应. 第一步,准备好前台的html表单,和jquery实现的ajax请求 <html lang=& ...

  4. 利用Python进行数据分析 第8章 数据规整:聚合、合并和重塑.md

    学习时间:2019/11/03 周日晚上23点半开始,计划1110学完 学习目标:Page218-249,共32页:目标6天学完(按每页20min.每天1小时/每天3页,需10天) 实际反馈:实际XX ...

  5. python数据库基础

    1.数据类型:(使用原则:够用就行,尽量使用范围小的) 整数:int,bit 小数:decimal 字符串:varchar(可变长度),char(固定长度字符串) 日期时间:date,time,dat ...

  6. 如何自定义xml文件

    在定义文件之前,首先要弄清楚什么是xml文件和dtd文件. 一:什么是xml文件? xml是一种可扩展标记性语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有构造性的标记语言. 二:什么事d ...

  7. (超实用)前端地址栏保存&获取参数,地址栏传输中文不在乱码

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://www.cnblogs.com/autoXingJY/p/115965 ...

  8. SQL Server2008存储过程中函数的用法(举例)

    USE   数据库 GO SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO CREATE   function  函数名称 (@EmpID   nvarcha ...

  9. Docker可视化管理工具portainer的简单应用

    portainer简介 略 安装portainer $ docker pull portainer/portainer$ docker volume create portainer_data $ d ...

  10. PDA无线移动开单智能新生活,省时、省心、省力

    纯手工4个小时 VS移动PDA开单10分钟 无论你是营业办公还是需要上门接货,开单都是一件重要且繁琐的事情.我们了解到传统物流业务运营都是通过手抄单.表格.补录运单来重复操作每一笔业务,手动填写纸质单 ...