20190609学习日记

本文详细介绍了μC/OS-II操作系统中的任务管理,包括任务的创建、删除、挂起与恢复,以及任务调度、延时函数、事件控制块和信号量、邮箱、消息队列等通讯机制。此外,还讨论了文件操作,如FATFS文件系统的使用,如打开、读取、写入和管理文件与目录。内容深入浅出,适合嵌入式系统开发者参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#2019.6.6
#UCOSII Learning… …(continue)
#三、内核结构
##1.临界段

UCOSII为了处理临界段代码需要关中断,处理完毕后在开中断,能够避免同时有其他任务或中断服务进入临界段代码。两个宏的调用分别是:OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL().
##2.任务
一个任务通常是一个无限的循环,一个任务看起来像其他c的函数一样,有函数返回类型,有形参变量,但是任务是绝不会返回的。
用户在建立一个任务的时候,将任务的起始地址与其他参数一起传给下面两个函数中的一个:OSTASTCREAT或OSTAKSCREATEXT()
##3.任务状态
把任务交给UCOSII是用过调用下面两个函数之一:OSTaskCreate()或OSTaskCreateExt(),当任务一旦建立,这个任务就进入就绪态准备运行。
一个任务可以通过调用OSTaskDel()返回到睡眠态,或通过调用该函数让另一个任务进入睡眠态。
调用OSStart()可以启动多任务
正在运行的任务调用两个函数之一将自身延时一段时间,OSDTimeDly()或OSDTimeDlyHMSM()。这个任务于是进门如等待状态,等待这段时间过去,下一个优先级最高的并进入就绪态的任务立刻被赋予CPU的控制权。等待时间过去以后,系统服务函数OSTimeTick()是延时了的任务进入就绪态。
正在运行的任务期待某一时间发生时也需要等待,手段时调用以下三个函数之一:OSSemPend()OSMbosPend()OSQPend()调用后任务进入等待状态。
正在运行的任务是可以被中断的,除非该任务将中断关了,或者μC/OS-Ⅱ将中断关了。被中断了的任务就进入了中断服务态(ISR)。响应中断时,正在执行的任务被挂起,中断服务子程序控制了CPU的使用权。中断服务子程序可能会报告一个或多个事件的发生,而使一个或多个任务进入就绪态。在这种情况下,从中断服务子程序返回之前,μC/OS-Ⅱ要判定,被中断的任务是否还是就绪态任务中优先级最高的。如果中断服务子程序使一个优先级更高的任务进入了就绪态,则新进入就绪态的这个优先级更高的任务将得以运行,否则原来被中断了的任务才能继续运行。
##4.任务控制块
一旦任务建立了,任务控制块OS_TCBs将被赋值。当任务的CPU使用权被剥夺时,μC/OS-Ⅱ用它来保存该任务的状态。当任务重新得到CPU使用权时,任务控制块能确保任务从当时被中断的那一点丝毫不差地继续执行。
OSTCBStkPtr是指向当前任务栈顶的指针。
OSTCBExtPtr 指向用户定义的任务控制块扩展。
OSTCBStkBottom是指向任务栈底的指针。
OSTCBStkSize存有栈中可容纳的指针元数目而不是用字节(Byte)表示的栈容量总数。
OSTCBEventPtr是指向事件控制块的指针,
OSTCBMsg是指向传给任务的消息的指针。
OSTCBStat是任务的状态字。
OSTCBPrio是任务优先级。
##5.任务调度
任务级的调度是由函数OSSched()完成的。中断级的调度是由另一个函数OSIntExt()完成的。
##3.6给调度器上锁和开锁(Locking and UnLocking the Scheduler)
给调度器上锁函数OSSchedlock()用于禁止任务调度,直到任务完成后调用给调度器开锁函数OSSchedUnlock()为止。调用OSSchedlock()的任务保持对CPU的控制权,尽管有个优先级更高的任务进入了就绪态。然而,此时中断是可以被识别的,中断服务也能得到(假设中断是开着的)。OSSchedlock()和OSSchedUnlock()必须成对使用。
当低优先级的任务要发消息给多任务的邮箱、消息队列、信号量时,用户不希望高优先级的任务在邮箱、队列和信号量没有得到消息之前就取得了CPU的控制权,此时,用户可以使用禁止调度器函数。
##3.7空闲任务(Idle Task)
μC/OS-Ⅱ总是建立一个空闲任务,这个任务在没有其它任务进入就绪态时投入运行。这个空闲任务[OSTaskIdle()]永远设为最低优先级,即OS_LOWEST_PRI0。空闲任务OSTaskIdle()什么也不做,只是在不停地给一个32位的名叫OSIdleCtr的计数器加1,统计任务使用这个计数器以确定现行应用软件实际消耗的CPU时间。
##3.8时钟节拍
用户必须在多任务系统启动以后再开启时钟节拍器,也就是在调用OSStart()之后。换句话说,在调用OSStart()之后做的第一件事是初始化定时器中断。
##3.9μC/OS-Ⅱ初始化
在调用μC/OS-Ⅱ的任何其它服务之前,μC/OS-Ⅱ要求用户首先调用系统初始化函数OSIint()。OSIint()初始化μC/OS-Ⅱ所有的变量和数据结构.
OSInit()建立空闲任务idle task,这个任务总是处于就绪态的。空闲任务OSTaskIdle()的优先级总是设成最低,即OS_LOWEST_PRIO。
##3.10μC/OS-Ⅱ的启动
多任务的启动是用户通过调用OSStart()实现的。然而,启动μC/OS-Ⅱ之前,用户至少要建立一个应用任务



#四、任务管理
##1.建立任务,OSTaskCreate()

任务可以在多任务调度开始前建立,也可以在其它任务的执行过程中被建立。在开始多任务调度(即调用OSStart())前,用户必须建立至少一个任务。任务不能由中断服务程序(ISR)来建立。
用户在调用OSTaskCreate()的时候必须知道堆栈是递增的还是递减的(参看所用处理器的OS_CPU.H中的OS_STACK_GROWTH),因为用户必须得把堆栈的栈顶传递给OSTaskCreate(),而栈顶可能是堆栈的最高地址(堆栈从上往下递减),也可能是最低地址(堆栈从下往上长)。
如果OSTaskCreate()函数是在某个任务的执行过程中被调用(即OSRunning置为True),则任务调度函数会被调用来判断是否新建立的任务比原来的任务有更高的优先级。如果新任务的优先级更高,内核会进行一次从旧任务到新任务的任务切换。如果在多任务调度开始之前(即用户还没有调用OSStart()),新任务就已经建立了,则任务调度函数不会被调用。
##2.建立任务,OSTaskCreateExt()
OSTaskCreateExt()需要九个参数!前四个参数(task,pdata,ptos和prio)与OSTaskCreate()的四个参数完全相同。
pbos是指向任务的堆栈栈底的指针,用于堆栈的检验。
stk_size用于指定堆栈成员数目的容量。
pext是指向用户附加的数据域的指针,用来扩展任务的OS_TCB。
opt用于设定OSTaskCreateExt()的选项,指定是否允许堆栈检验,是否将堆栈清零,任务是否要进行浮点操作等等。
##3.任务堆栈
每个任务都有自己的堆栈空间。堆栈必须声明为OS_STK类型,并且由连续的内存空间组成。
##4.删除任务,OSTaskDel()
有时候删除任务是很有必要的。删除任务,是说任务将返回并处于休眠状态。
OSTaskDel()一开始应确保用户所要删除的任务并非是空闲任务,因为删除空闲任务是不允许的。
接着,OSTaskDel()还应确保用户不是在ISR例程中去试图删除一个任务,因为这也是不被允许的
接下来OSTaskDel()会保证被删除的任务是确实存在的
##5.请求删除任务,OSTaskDelReq()
在这种情况下,用户可以想法子让拥有这些资源的任务在使用完资源后,先释放资源,再删除自己。
##6.改变任务的优先级,OSTaskChangePrio()
OSTaskChangePrio()。用户不能改变空闲任务的优先级,但用户可以改变调用本函数的任务或者其它任务的优先级。
##7.挂起任务,OSTaskSuspend()
有时候将任务挂起是很有用的。挂起任务可通过调用OSTaskSuspend()函数来完成。被挂起的任务只能通过调用OSTaskResume()函数来恢复。任务挂起是一个附加功能。也就是说,如果任务在被挂起的同时也在等待延时的期满,那么,挂起操作需要被取消,而任务继续等待延时期满,并转入就绪状态。任务可以挂起自己或者其它任务。
如果用户没有挂起调用本函数的任务,OSTaskSuspend()就没有必要运行任务调度程序,因为正在挂起的是较低优先级的任务。
##8.恢复任务,OSTaskResume()
被挂起的任务只有通过调用OSTaskResume()才能恢复。
#五、时间管理
##1.任务延时函数,OSTimeDly()
申请该服务的任务可以延时一段时间,这段时间的长短是用时钟节拍的数目来确定的。实现这个系统服务的函数叫做OSTimeDly()。
调用该函数会使µC/OS-Ⅱ进行一次任务调度,并且执行下一个优先级最高的就绪态任务。任务调用OSTimeDly()后,一旦规定的时间期满或者有其它的任务通过调用OSTimeDlyResume()取消了延时,它就会马上进入就绪状态.注意,只有当该任务在所有就绪任务中具有最高的优先级时,它才会立即运行。
##2.按时分秒延时函数 OSTimeDlyHMSM()
调用OSTimeDlyHMSM()函数也会使µC/OS-Ⅱ进行一次任务调度,并且执行下一个优先级最高的就绪态任务。
任务调用OSTimeDlyHMSM()后,一旦规定的时间期满或者有其它的任务通过调用OSTimeDlyResume()取消了延时,它就会马上处于就绪态。
同样,只有当该任务在所有就绪态任务中具有最高的优先级时,它才会立即运行。
##3.系统时间,OSTimeGet()和OSTimeSet()
OSTimeGet()来获得该计数器的当前值。
OSTimeSet()来改变该计数器的值。



#六、任务之间的通讯与同步
一是利用宏OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()来关闭中断和打开中断。
二是利用函数OSSchedLock()和OSSchekUnlock()对µC/OS-II中的任务调度函数上锁和开锁。
另外三种用于数据共享和任务通讯的方法:信号量、邮箱和消息队列。
##1.事件控制块ECB

定义的OS_EVENT数据结构来维护一个事件控制块的所有信息,也就是本章开篇讲到的事件控制块ECB。
该结构中除了包含了事件本身的定义,如用于信号量的计数器,用于指向邮箱的指针,以及指向消息队列的指针数组等,还定义了等待该事件的所有任务的列表。
程序清单 L6.1 ECB数据结构
typedef struct {
void OSEventPtr; / 指向消息或者消息队列的指针 /
INT8U OSEventTbl[OS_EVENT_TBL_SIZE]; /
等待任务列表 /
INT16U OSEventCnt; /
计数器(当事件是信号量时) /
INT8U OSEventType; /
时间类型 /
INT8U OSEventGrp; /
等待任务所在的组 */
} OS_EVENT;

##2.初始化一个事件控制块,OSEventWaitListInit()

当建立一个信号量、邮箱或者消息队列时,相应的建立函数OSSemInit(),OSMboxCreate(),或者OSQCreate()通过调用OSEventWaitListInit()对事件控制块中的等待任务列表进行初始化。
##3.使一个任务进入就绪态,OSEventTaskRdy()
当发生了某个事件,该事件等待任务列表中的最高优先级任务(Highest Priority Task – HPT)要置于就绪态时,该事件对应的OSSemPost(),OSMboxPost(),OSQPost(),和OSQPostFront()函数调用OSEventTaskRdy()实现该操作。
##4.使一个任务进入等待某事件发生状态, OSEventTaskWait()
当某个任务要等待一个事件的发生时,相应事件的OSSemPend(),OSMboxPend()或者OSQPend()函数会调用该函数将当前任务从就绪任务表中删除,并放到相应事件的事件控制块的等待任务表中。
##5.由于等待超时而将任务置为就绪态, OSEventTO()
当在预先指定的时间内任务等待的事件没有发生时,OSTimeTick()函数会因为等待超时而将任务的状态置为就绪。在这种情况下,事件的OSSemPend(),OSMboxPend()或者OSQPend()函数会调用OSEventTO()来完成这项工作。该函数负责从事件控制块中的等待任务列表里将任务删除,并把它置成就绪状态。最后,从任务控制块中将指向事件控制块的指针删除。用户应当注意,调用OSEventTO()也应当先关中断。
##6.信号量
信号量由两部分组成:一个是信号量的计数值,它是一个16位的无符号整数(0 到65,535之间);另一个是由等待该信号量的任务组成的等待任务表。
在使用一个信号量之前,首先要建立该信号量,也即调用OSSemCreate()函数(见下一节),对信号量的初始计数值赋值。

如果信号量是用来表示一个或者多个事件的发生,那么该信号量的初始值应设为0。如果信号量是用于对共享资源的访问,那么该信号量的初始值应设为1
###1.建立一个信号量, OSSemCreate()
信号量一旦建立就不能删除了,因此也就不可能将一个已分配的任务控制块再放回到空闲ECB链表中。如果有任务正在等待某个信号量,或者某任务的运行依赖于某信号量的出现时,删除该任务是很危险的。
###2.等待一个信号量, OSSemPend()
###3.发送一个信号量, OSSemPost()
###4.无等待地请求一个信号量, OSSemAccept()
当一个任务请求一个信号量时,如果该信号量暂时无效,也可以让该任务简单地返回,而不是进入睡眠等待状态。这种情况下的操作是由OSSemAccept()函数完成的
##7.邮箱
邮箱是µC/OS-II中另一种通讯机制,它可以使一个任务或者中断服务子程序向另一个任务发送一个指针型的变量。该指针指向一个包含了特定“消息”的数据结构。
使用邮箱之前,必须先建立该邮箱。该操作可以通过调用OSMboxCreate()函数来完成,并且要指定指针的初始值。
###1.建立一个邮箱,OSMboxCreate()

邮箱一旦建立,是不能被删除的。比如,如果有任务正在等待一个邮箱的信息,这时删除该邮箱,将有可能产生灾难性的后果。
###2.等待一个邮箱中的消息,OSMboxPend()
###3.发送一个消息到邮箱中,OSMboxPost()
###4.无等待地从邮箱中得到一个消息, OSMboxAccept()
###5.查询一个邮箱的状态, OSMboxQuery()
###6.用邮箱作二值信号量
###7.用邮箱实现延时,而不使用OSTimeDly()
邮箱的等待超时功能可以被用来模仿OSTimeDly()函数的延时,如果在指定的时间段TIMEOUT内,没有消息到来,Task1()函数将继续执行。这和OSTimeDly(TIMEOUT)功能很相似。但是,如果Task2()在指定的时间结束之前,向该邮箱发送了一个“哑”消息,Task1()就会提前开始继续执行。
##8.消息队列
消息队列是µC/OS-II中另一种通讯机制,它可以使一个任务或者中断服务子程序向另一个任务发送以指针方式定义的变量。
消息队列的符号很像多个邮箱。实际上,我们可以将消息队列看作时多个邮箱组成的数组,只是它们共用一个等待任务列表。每个指针所指向的数据结构是由具体的应用程序决定的。



#七、内存管理
在ANSI C中可以用malloc()和free()两个函数动态地分配内存和释放内存。但是,在嵌入式实时操作系统中,多次这样做会把原来很大的一块连续内存区域,逐渐地分割成许多非常小而且彼此又不相邻的内存区域,也就是内存碎片。由于这些碎片的大量存在,使得程序到后来连非常小的内存也分配不到。
##1.内存控制块
为了便于内存的管理,在µC/OS-II中使用内存控制块(memory control blocks)的数据结构来跟踪每一个内存分区,系统中的每个内存分区都有它自己的内存控制块。
**2019/6/9 10:57:20 **









#afternoon
#FATFS 文件操作 Learning … …
#FatFs - 通用FAT文件系统模块
##一.注册工作区域
FRESULT f_mount (
BYTE Drive , /* Logical drive number / FATFS FileSystemObject /* Pointer to the work area /
);
函数说明:
1. 此函数的作用就是在磁盘里注册一个缓冲区域,用来存储 FAT32 文件系统的一些相关信 息.
2. 参数说明:
a) Drive : 盘符
b) FileSystemObject : 指向缓冲区域的指针
3. 对磁盘进行操作之前,这个函数是不可少的
例程 : f_mount(0 , &fs);
##二.打开文件夹
FRESULT f_opendir (
DIR
DirObject , /
Pointer to the blank directory object structure /
const TCHAR
DirName /* Pointer to the directory name */
)
函数说明:

  1. 此函数可以打开一个已存在的文件夹
  2. 参数说明:
    a) DirObject : 指向一个空白的结构体,用来存储要打开的文件夹信息
    b) DirName : 指向该文件夹名称的指针
    ##三.读取文件夹
    FRESULT f_readdir (
    DIR
    DirObject , /
    Pointer to the open directory object /
    FILINFO
    FileInfo /* Pointer to the file information structure */
    );
    函数说明:
  3. 此函数按照顺序读取文件夹内文件
  4. 参数说明:
    a) *DirObject : 指向读取的文件夹的信息结构体的指针
    b) *FileInfo : 指向文件信息结构体,用来存储读取到的文件的信息
  5. 重复调用此函数可读取文件夹内所有文件
  6. 当所有文件读取结束,函数返回一个空字符串到 f_name[] 中
  7. 如果一个空指针赋给 FileInfo ,将返回从第一个文件开始读取.
    #四.打开 \新建一个文件
    FRESULT f_open (
    FIL
    FileObject , /* Pointer to the blank file object structure /
    const TCHAR
    FileName , /* Pointer to the file neme / BYTE ModeFlags / Mode flags */
    );
    函数说明:
  8. 此函数可以打开,或新建一个文件
  9. 参数说明
    a) FileObject : 指向一个用来存储文件对象的空结构体的指针
    b) FileName : 指向文件名的指针
    c) ModeFlags : 打开 方式,可 以是以下 一种或几种 的组合(默认方式是 FA_OPEN_EXISTING)
    FA_READ 读模式,(读写模式可同时生效)
    FA_WRITE 写模式,(读写模式可同时生效)
    FA_OPEN_EXISTING 默认打开方式
    FA_OPEN_ALWAYS
    打开文件,如果文件不存在,则创建一个新文件; 用此种方式,可以用 f_lseek 在文件后追加数据
    FA_CREATE_NEW 新建文件,如果文件已存在,则新建失败
    FA_CREATE_ALWAYS 新建文件,如果文件已存在,覆盖旧文件
    ##五.读取文件
    FRESULT f_read (
    FIL
    FileObject , /
    Pointer to the file object structure /
    void
    Buffer , /* Pointer to the buffer to store read data /
    UINT ByteToRead , /
    Number of bytes to read /
    UINT
    ByteRead /* Pointer to the variable to return number of bytes read /
    );
    函数说明:
    1. 这个函数可以读取文件的内容
    2. 参数说明:
    a) FileObject : 指向文件对象结构体的指针
    b) *Buffer : 指向存储读取到的数据的缓冲的指针
    c) ByteToRead : 准备读取的字节数
    d) *ByteRead :
    i. 它的作用就是用来检测文件的尾,就是下面例程中的这一句: if (res || br < sizeof(buffer)) break;
    ii. 每次 f_read 执行完后,ByteRead 值等于本次读取到的字节数,若ByteRead <ByteToRead,即本次读取到的字节小于准备读取的字节,说明读指针已到达 文件尾.
    ##六.写文件
    FRESULT f_write (
    FIL
    FileObject , /
    Pointer to the file object structure /
    const void
    Buffer , /* Pointer to the data to be written /
    UINT ByteToWrite , /
    Number of bytes to write /
    UINT
    ByteWritten /* Pointer to the variable to return number of bytes written */
    );
    函数说明:
    1. 此函数用来向文件中写入数据,前提是以写文件的方式打开文件
    2. 参数说明:
    a) FileObject : 指向文件对象结构体的指针
    b) Buffer : 指向数据缓冲的指针
    c) ByteToWrite : 准备写入的字节数
    d) ByteWritten : 记录已写入的字节数,用来检测是否写完
    3. 后两个参数的长度都是两个字节,计数值最大为 65536,所以一次写入字节数最大为 64K。一般情况下一次不会写这么长的数据,因为就算 RAM 足够用,也不会在里面开一 个几十 K 的数据缓冲区。
    ##七.移动文件指针:
    FRESULT f_lseek (
    FIL
    FileObject , /
    Pointer to the file object structure /
    DWORD Offset /
    File offset in unit of byte /
    );
    函数说明:
    1. 此函数在对已打开的文件进行读或写时,可以移动当前指针位置
    2. 参数说明:
    a) FileObject : 指向文件对象结构体的指针
    b) Offset : 指针移动的长度
    ##八.新建文件夹 :
    FRESULT f_mkdir (
    const TCHAR
    DirName /
    Pointer to the directory name */
    );
    函数说明:
    1. 新建一个文件夹
    2. 参数说明:
    a) *DirName : 指向将要创建的文件夹名的指针
    3. 文件名应符合 fatfs 标准,不能包非法字符,
    4. 若不支持长文件名,文件名长度不能大于 8,否则新建不成功
    5. 例程:
    a) f_mkdir(“new”);
    b) f_mkdir(“folder/new”);

##九.删除文件或文件夹 :
FRESULT f_unlink (
const TCHAR* FileName /* Pointer to the object name */
);
函数说明:
1. 此函数可以删除一个文件或文件夹
2. 参数说明:
a) *FileName : 指向文件或文件夹的名称的指针
3. 删除文件夹时:
a) 不能为当前文件夹
b) 不能为非空文件夹
4. 删除文件时
a) 不能为已打开文件
b) 不能为只读文件

##十.重命名 \ 移动文件或文件夹
FRESULT f_rename (
const TCHAR* OldName , /* Pointer to old object name /
const TCHAR
NewName /* Pointer to new object name */
);
函数说明:
1. 此函数可以移动或重命名一个文件或文件夹
2. 参数说明:
a) *OldName : 指向旧文件名的指针
b) *NewName : 指向新文件名的指针
3. 此函数可重命名 文件 或 文件夹 ,而不论文件夹是否为空
4. 此函数可移动 文件 或 文件夹 ,而不论文件夹是否为空

例程:
res = f_rename(“folder/old.txt”,“folder/newname.txt”); //重命名 文件,
res = f_rename(“folder/123.txt”,“new/456.txt”); //将文件夹 folder 中的 123.txt 文件,移动到文件 夹 new 中并重命名为 456.txt

##十一.改变文件属性:
FRESULT f_chmod (
const TCHAR* FileName , /* Pointer to the file or directory /
BYTE Attribute , /
Attribute flags /
BYTE AttributeMask /
Attribute masks */
);
函数说明:

  1. 此函数可以修改文件或文件夹的属性
  2. 可修改的属性只能是以下一种或几种的组合,对其它属性无效 Attribute Description
    AM_RDO Read only
    AM_ARC Archive
    AM_SYS System
    AM_HID Hidden
  3. 参数说明:
    a) *Filename:指向文件或文件夹的名称的指针
    b) Attribute : 要置位的属性
    c) AttributeMask:需要改变的属性(包括要置位的和要清除的属性)
  4. 使用方法:
    a) Attribute 须为 AttributeMask 的子集
    b) 函数对 AttributeMask 中的属性集合进行处理,若属性包在 Attribute 中,则置位,否则清除

#2019/6/9 13:56:31
#熔接机程序的详细解读
#一、GUI界面
##详细解读

定义一个OS_CPU_SR(无符号整型)类型的cpu_sr变量
定义一个u8类型的err错误变量
建立一个信号量Time_Senter(互斥访问时钟)
循环检测GUI任务是否初始化(成功则继续,失败则进入延时进行任务调度)
1.上调语句执行成功则继续
2.LCD液晶屏初始化
3.时钟芯片DS1302的引脚初始化
4.GUI初始化
5.设置小工具无效果,禁止显示外框
6.设置GUI任务初始化状态(初始化完成)
7.等待开机初始化完成

1.获取电源任务初始化状态(初始化成功)
2.检测电源按键状态(若按下则继续)
3.初始化LCD 背光亮度
4.打开LCD电源引脚
5.开机动画显示
6.老化测试放电以及加热

8.延时程序(等待任务调度)
9.初始化LCD 背光亮度
10.清屏,白色
11.检查flash
12.开机LOGO显示
13.开机画面显示1S(等待任务调度)
14.触摸校准(非触摸屏不需要校准)
GUI_START:

1.关闭熔接机运行
2.GUI页面所需参数初始化
3.密码管理系统(本系统无密码)

GUI_LOCK:
15.网络功能(无网络功能不使用)
16.清除按键缓冲区
17.清除按键状态
18.进入工作界面

1.上电后显示熔接界面
2.初始化菜单项的有效性
3.开启熔接机

19.GUI循环

1.GUi任务界面处理,GUI界面分为三种,分别为USB界面,熔接界面和菜单界面

1.检测USB 插入状态和拔出状态
2.获取当前页面所属种类
3.根据不同状态选择不同界面

1.USB界面,根据USB 状态进行相应处理

1.检测USB插入状态
2.若插入(1.关闭DCMI 2.进入USB 插入提示界面
3.否则(1.清除按键缓冲区 2.进入熔接界面 3.关闭DCMI 4.刷屏 5.开启DCMI 6.设置界面状态为下一状态熔接界面状态)

2.熔接界面的按键处理

1.网络功能检测(无网络功能跳过)
2.触摸屏检测(非触摸屏跳过)
3.机型判断(非3号机型跳过)
4.在熔接界面,按QUIT 按键切换摄像头显示模式
5.菜单按键切换到菜单界面

1.当前模式为手动模式,进入菜单界面,应挂起熔接任务,上下左右键禁止电机动作
2.挂起任务之前,禁止放电,关闭放电
3.如果电机处于复位中,则复位完成后挂起
4.否则直接挂起熔接任务
5.进入管理页面
6.关闭摄像头
7.设置页面状态为菜单界面状态
8.通知主控进入菜单界面
9.清除按键缓冲区

6.当前模式为手动模式,保证在熔接界面为唤醒状态(挂起熔接任务)
7.如果当前操作模式为手动模式,长按退出键,直接切换手动模式左右光纤
8.获得当前电量
9.电量发生变化,则刷新
10.网络功能检测(无网络功能跳过)
11.更新熔接界面的显示

3.菜单页面下的处理

1.获得当前按键缓冲区首按键并清除
2.清除按键标志位
3.离开当前页面时检测数据是否改变 如果数据发生过修改,则提醒保存

1.当热缩编号发生变化时,如果数据发生过修改,则提醒保存
2.当退出熔接参数界面时判断熔接参数是否被修改过
3.退出图像参数界面时,更改语言
4.高级菜单
5.返回上一级菜单时判断系统参数数据是否被修改过,由手动界面返回时不做判断

4.更改熔接模式为自动。
5.保证菜单页面不显示熔接画面
6.避免刚进入到关于界面刷屏停顿
7.避免刚进入到界面刷屏停顿
8.避免刚进入查询熔接图像界面刷屏停顿
9.各参数发生改变时,系统参数修改后的提醒
10.参数未发生改变时,进入其他各种界面
11.刷新界面

4.设置GUI状态(5秒内无键盘操作认为GUI 空闲)
5.间隔性的获取时间,以便在界面显示
6.刷屏显示

2.密码管理功能检测(无密码系统跳过)
3.触摸屏幕检测(非触摸屏跳过)
4.网络功能检测(无网络功能跳过)
5.延时,刷屏频率100ms(等待任务调度)

#二、FLASH
##详细解读

1.各种参数的定义
2.UnlockFunLock=互斥信号量的创建OSMutexCreate
3.提交互斥信号量OSMutexPost
4.sem_flash_lock信息量的创建
5.获取开机数据
6.设置当前Flash状态
7.FLASH任务的初始化
8.FLASH循环任务

1.延时任务(等待任务调度)
2.收到关机通知,避免由于突然断电而造成的文件损坏,所以不进行之后的数据修复工作
3.插适配器充电,随时可能突然断电,所以不进行数据保存和修复工作
4.插USB ,用户可能随时操作外部文件,所以不进行数据保存和修复工作
5.完成恢复出厂,则直接等待关机

1.开机后只允许一次恢复,防止多次操作(对各种数据进行恢复)
2.通知完成恢复
3.等待关机

6.防止usb破坏数据
7.熔接热缩检查修复
8.内存参数检测修复
9.内核 评估 电极 摄像头 参数检测修复
10.响应关机保存
11.响应开机
12.防止usb破坏数据

#三、按键任务
##详细解读

1.各种参数定义
2.按键管脚初始化
3.建立一个互斥信号 在读取key_sta之前必须等待信号量空闲,用完后再发出该信号量
4.创建一个信号量 信号量的初始值为1 当改变1为0时只有当OSSemPost发生OSSemPend才能等到事件
5.对按键任务初始化
6.默认上电防风盖闭合
7.设置按键任务通道初始化状态
8.2s独立看门狗初始化
9.按键循环任务

1.按键检测

1.按键空闲时间增加计数
2.循环分析每个按键
3.读取端口状态,存入buffer
4.取出相应按键对应位的值
5.进入状态机进行分析

1.按键初始状态
2.按键按下,进入消抖确认态
3.确认按键按下状态
4.持续输入计数
5.按键按下消抖
6.再次判断按键是否按下
7.按键按下,相应位置1
8.按键状态改变
9.按键空闲时间清零
10.滤波后检测到按下
11.检测到USB 插入,通知主控
12.判断是不是组合键成员
13.将按键按下状态放入队列
14.存储满则从头开始
15.短按状态
16.只有按键才会进入下一状态
17.虚拟按键在此状态循环,不进入之后的状态,等待进入释放
18.长按状态
19.长按过后继续计数
20.按键异常状态,发生故障时只写一次异常记录
21.按键抬起,相应状态位清零
22.按键空闲时间清零
23.清除故障状态
24.检测到USB 拔出,通知主控
25.组合键清零
26.回到初始状态,等待按键动作

6.保存上一次状态,并打印按键当前状态

2.触摸屏检测(无触摸屏跳过)
3.声音函数
4.喂狗函数
5.延时一个时钟滴答(等待任务调度)

#四、通讯任务
##详细解读

1.各种变量定义
2.创建一个信号量
3.等待通讯任务初始化完成
4.申请应用看门狗
5.串口初始化
6.设置通讯任务通道初始化状态
7.通讯循环任务

1.检查看门狗是否超时
2.若没有进行串口初始化和喂狗函数
3.等待一个信号量
4.通讯接受信息分析

1.ind每接收一个字符加1
2.ind为0时,没有数据继续接受
3.ind为1时,如果字符串首位不为0xFC,跳出。若是则接受完毕
4.ind为其他时,接受完毕但是校验位不和

5.符合通讯协议的,清定时器,数据处理,清除数据标志
6.协议未接收完整,继续接受
7.其他情况,清除数据标志

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值