找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4115|回复: 21
收起左侧

IAR平台移植TI OSAL到STC8A8K64S4A12单片机中

  [复制链接]
ID:351097 发表于 2019-8-30 21:31 | 显示全部楼层 |阅读模式
   玩过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所需主要文件
全部文件.PNG

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

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

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

3、中断临界保护
中断临界保护.PNG

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

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

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

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

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

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

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

演示3.PNG

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

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

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

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:20672 发表于 2019-9-11 21:27 | 显示全部楼层
谢谢分享~~~~好资料,51黑有你更精彩!!!
回复

使用道具 举报

ID:371527 发表于 2019-9-26 11:50 | 显示全部楼层
谢谢!试试
回复

使用道具 举报

ID:599571 发表于 2019-9-29 02:37 | 显示全部楼层
这是个很好的思路,谢谢分享
回复

使用道具 举报

ID:117433 发表于 2019-11-7 15:10 | 显示全部楼层
我以前学过ZIGBEE,由于觉得ZIGBEE传输太近,就放弃了,改用LORA,单片机用STC的,自己编确实漏洞太多,,所以就尝试操作系统
回复

使用道具 举报

ID:117433 发表于 2019-11-11 09:10 | 显示全部楼层
学喜了,可是我,这是不是从ZSTACK上下的
回复

使用道具 举报

ID:351097 发表于 2019-11-11 23:14 | 显示全部楼层
xizhe2005 发表于 2019-11-11 09:10
学喜了,可是我,这是不是从ZSTACK上下的

我用过CC2541,感觉OSAL挺适合8位单片机的,就做了移植。
回复

使用道具 举报

ID:639647 发表于 2019-11-13 15:09 | 显示全部楼层
下载的东西看不了,装了IAR也看不了,还有过程没说清楚,STC是用UART下载程序的,IAR是用可以调试的那种JTAG接口,到底怎么把程序下载到STC单片机上呢,能不能说详细点
回复

使用道具 举报

ID:351097 发表于 2019-11-14 09:37 | 显示全部楼层
xizhe2009 发表于 2019-11-13 15:09
下载的东西看不了,装了IAR也看不了,还有过程没说清楚,STC是用UART下载程序的,IAR是用可以调试的那种JTA ...

IAR工程缺少STC的环境,你可以看我之前发的帖子:在IAR平台建立STC8ASK64S4A12单片机工程。然后就可以编译我的工程了,编译成功后,有产生hex文件,你用stc-isp软件把hex文件烧录到STC单片机就行,IAR不支持STC单片机在线调试。
回复

使用道具 举报

ID:645651 发表于 2019-11-20 11:20 | 显示全部楼层
单片机就是缺少系统,osal确实方便
回复

使用道具 举报

ID:20672 发表于 2020-1-1 09:18 | 显示全部楼层
请问有keil的工程吗??
回复

使用道具 举报

ID:351097 发表于 2020-1-2 11:36 | 显示全部楼层
wdliming 发表于 2020-1-1 09:18
请问有keil的工程吗??

没有,你自己把osal的几个文件移植到keil工程里面,再做一下数据类型的兼容就行。
回复

使用道具 举报

ID:20672 发表于 2020-1-2 16:55 | 显示全部楼层
没有你 发表于 2020-1-2 11:36
没有,你自己把osal的几个文件移植到keil工程里面,再做一下数据类型的兼容就行。

好的多谢~~~~
回复

使用道具 举报

ID:117433 发表于 2020-1-3 16:28 | 显示全部楼层
楼主好人做到底,能不能做出KEIL工程供大家直接使用
回复

使用道具 举报

ID:351097 发表于 2020-1-3 21:36 | 显示全部楼层
xizhe2005 发表于 2020-1-3 16:28
楼主好人做到底,能不能做出KEIL工程供大家直接使用

暂时没有搞keil工程,你自己复制一下osal的几个文件到keil工程里面,osal详细的移植过程,帖子说得很清楚了。
回复

使用道具 举报

ID:696952 发表于 2020-2-23 15:13 | 显示全部楼层
有什么作用?详细介绍一下呗
回复

使用道具 举报

ID:564182 发表于 2020-2-27 16:45 来自手机 | 显示全部楼层
读按键不一点要用delay,开个20ms定时器去读in就好啦。或者rtos定时任务执行。
回复

使用道具 举报

ID:704910 发表于 2020-3-9 00:29 | 显示全部楼层
楼主的分享真心不错,我以前也用过CC2540  CC2541,里面的OSAL真心不错的,用在8位的51上挺合适的。不过用IAR来开发STC我还真没用过!!不过谢谢楼主分享的资源了!!
回复

使用道具 举报

ID:351097 发表于 2020-3-14 21:16 | 显示全部楼层
race_start 发表于 2020-3-9 00:29
楼主的分享真心不错,我以前也用过CC2540  CC2541,里面的OSAL真心不错的,用在8位的51上挺合适的。不过用I ...

感谢支持
回复

使用道具 举报

ID:646277 发表于 2021-5-5 13:28 | 显示全部楼层
高手,一直想移植,但没有成功
回复

使用道具 举报

ID:290373 发表于 2021-12-17 10:28 | 显示全部楼层
长见识了,感谢分享
回复

使用道具 举报

ID:514317 发表于 2022-3-26 12:02 | 显示全部楼层
哪位高手帮忙移植个keil工程啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表