Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 50340|回复: 0

UIP-Kernel开发应用时,针对不同类型的处理模型(原创)

[复制链接]

1

主题

1

帖子

51

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
51
发表于 2018-3-6 08:41:27 | 显示全部楼层 |阅读模式
        
作者:王保进
         (原创,转载或引用时请注明出处)
        


1.        周期性数据输入

       采用时间(alarm)触发或者事件(中断)触发的方式,周期的将数据从外部接口导入到系统维护的“数据池”中,之后利用SetEvent或者ActivateTask的方式激活周期任务对数据进行后续处理。
2.        非周期性关键命令输入
       采用事件(中断)触发的方式,获得异步产生的非周期性数据。后续处理时,若不关联到共享资源,且能较为快速地处理完,例如设置GPIO电平高低,或者输出短消息等,可在中断处理程序中执行;若后续操作会关联到共享资源,或者执行时间较长,或者会关联到多个逻辑,则利用任务来处理,且中断处理程序中通过SetEvent或者ActivateTask的方式激活该任务来处理。
3.        非周期性大量数据输入
       有数据输入时,触发一个中断,因后续操作执行时间较长,则利用任务来处理。即,中断处理程序中通过SetEvent或者ActivateTask的方式激活任务来处理大量的输入数据。
4.        周期性数据输出
       利用alarm获得周期执行时机,设置alarm控制块相关字段,alarm到期后通过SetEvent或者ActivateTask激活处理任务输出数据;若输出操作时间较短,也可通过执行alarm关联的回调函数执行输出操作,从而减少任务切换次数。
5.        非周期性消息输出1,基于任务调度随时输出
       两种处理方式:
       1)在一个c文件中统一设计实现消息输出逻辑,但对其调用则分散在整个应用软件中,即,被多个任务适时调用。
       2)设计实现一个消息输出任务,等待(waiting)在事件上,或者处于终止状态,当其它任务需要输出消息时,则通过SendMessage激活该输出任务,并将输出数据传递过来;SendMessage中激活任务的方式可以是设置事件(SetEvent),也可以是激活任务(ActivateTask)。
6.        非周期性指令输出2,基于时间表、特定状态量输入、特定实时状态
      设计实现一个事件处理引擎(见framework_demo.c源代码),每次有事件到达时利用while(1)循环遍历一个结构体链表,若匹配上结构体链表中的某个事件,则执行对应的处理函数。该结构体中包含一个整型变量用于表征事件类型,还包含一个函数指针,指向处理函数。
      该事件处理引擎被一个任务调用,该任务平时处于等待(waiting)状态,被alarm或者中断处理程序中的SendMessage激活,当时间到或者事件到时,触发alarm或者中断处理程序。
      初始化时,基于需要的动作时间点或者状态量等事件,配置该结构体链表中每个结构体的成员数值。
7.        非周期性大量数据输出,某一时刻开始,进行一段时间的大量数据输出,实时性要求不高
      由一个低优先级任务实现数据输出,该任务平时处于等待(waiting)状态,等待多个事件(“与”(and)模式),当其它逻辑将各数据准备好后会设置相关事件,所有事件都被设置后,该任务将进入就绪状态,被调度执行后将执行一段时间的大量数据输出;因该任务优先级较低,在执行数据输出期间可以被其它处理关键逻辑或者数据的高优先级任务抢占。
8.        数据预处理,大规模计算
      一个或者多个任务实现该“大规模计算”,由数据到时触发的中断或者定时执行的alarm激活上述任务。根据预处理的执行时序和重要性来确定上述任务的优先级,并由该任务在大规模计算后通过调用SetEvent或者ActivateTask来同步后续逻辑的执行。因为是预处理阶段,所以可设置中等级别的优先级,能被更重要的任务抢占。
9.        数据预处理,来源于不同时间周期的数据同步
      由一个任务实现该数据预处理,该任务平时处于等待(waiting)状态,等待多个事件(“与”(and)模式),多个不同时间周期的alarm利用回调函数将数据导入数据池,再通过SetEvent设置事件,当所有数据就绪后,该任务被激活继续执行,完成数据预处理。
10.        任务调度,基于周期性数据进行切换,基于控制消息执行
      与(6)中执行方式类似,建立一个任务计划表,是一个结构体链表,在系统设计阶段离线定义控制消息的类型、个数与处理函数,并在系统软件初始化阶段注册到上述链表中。
      该调度任务的核心是计划处理引擎,类似于前述事件处理引擎(见framework_demo.c源代码),每次到达计划时机时,通过alarm或者其它中断处理程序使该任务的WaitEvent被激活,任务执行体利用while(1)循环遍历结构体链表,若匹配上结构体链表中的某个事件,则执行对应的处理函数,这些处理函数可以执行本地操作,也能通过调用SetEvent或者ActivateTask等系统API激活其它处理逻辑。
11.        参数共享和保护,大量参数的访问保护、实时接收的数据、预处理数据、状态量与消息
      对上述数据池或者其它参数池,若存在读写共享的情况,即,可能有多个任务读取或者写入数据池,则需要用资源(resource)机制保护这些共享数据。而且,GetResourceReleaseResource需要成对使用。此处的Resource等价于大家常见的Mutex,但使用了类似SRP协议的特殊PCP协议。
      根据实际情况对上述数据池或者参数池分组,将关联若干任务的数据分为一组,从而便于设置资源的冲顶优先级。


回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|UIP Kernel 论坛  

GMT+8, 2023-6-6 03:32 , Processed in 0.066701 second(s), 4 queries , File On.

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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