mg4155线路检测手机版

mg4155com > mg4155线路检测手机版 > 循环缓存区的兑现原理,QNX财富管理器

原标题:循环缓存区的兑现原理,QNX财富管理器

浏览次数:61 时间:2019-10-04

时有时会设置多个数组之类的用来储存不常接受的数额,由于数量是一时半刻的,具备不刚毅,随机性,如果没及时读取,会导致数据遗失,对工程的运转不利。

新近在某些RTOS上碰见三个体系BUG,几经折腾,终于将其斩于马下。结局美好,进度却很波折,在分析定位难点的时候,顺便把ARM上C函数调用stack frame机制捋了一回,记录并享受一下。

Nuttx相关的历史篇章

  • Nuttx Task Schedule

实信号是在软件等级次序上对中断机制的里丑捧心,在常理上说,三个职分接收到一个频限信号,与CPU接收到中断央浼是一致的。数字信号是异步的,任务不必经过其他操作来等待功率信号的达到,它竟然不知底连续信号几时会到达。能量信号的来源包含:

  • 硬件来源,比方按键触发
  • 软件来源,举个例子kill,raise等种类函数,举例一些违法运算操作等

Nuttx为经过和线程提供了时域信号接口,能够在任务上下文中或在任务上下文之间,通过复信号这种异步通讯机制,来更改职责的调整流。在另外一个任务中或中断管理函数中,能够给钦赐TASK ID的其他职务发送非连续信号。接收到时域信号的天职就要颇有优先级时实施任务钦赐的复信号管理函数。信号管理程序是三个客商提供的函数,它绑定到一个一定的信号,并在吸收接纳到非确定性信号时进行另外要求的操作。暗许意况下,未有对其它频域信号设置预约义动作,全数实信号的私下认可操作都以忽视(借使顾客并未有提供功率信号管理函数),从那一个意义上说,全体Nuttx循环缓存区的兑现原理,QNX财富管理器。暗中同意景况下都是实时实信号。

Nuttx既扶助义务task,又扶助线程pthreadstaskpthreads的显要不同在于task里面包车型客车独立性要高得多。task能够成立pthreads,这些pthreads将共享task的资源。主task线程和它所蕴涵的pthreads,一同被誉为职务组,在Nuttx中央银行使职分组来模拟POSIX的进程。

十二线程职分组中的复信号行为是复杂的。Nuttx利用职务组模拟进度,并遵从POSIX平整进行时域信号发送。经常,当向三个职务组发送能量信号时,必要向成立该职分组的主task线程的ID号发送(实际上,其余任务不应有知道该职务组中创设的个中线程ID)。职务组会记住该ID(尽管主任务线程退出)。

当向多少个三十二线程职责组发送功率信号时,会并发以下情形:

  • 当职务组接收到贰个时域信号,那么任务组中独有一个不封堵该实信号的不鲜明线程会接收到信号。
  • 当职责组接收到叁个时限信号,而且有五个线程在等候该确定性信号,有且唯有二个不鲜明的线程将收到该随机信号。

能够应用sigprocmask()pthread_sigmask()接口来蒙蔽频域信号。功率信号被挡住后,将不会在具有屏蔽该信号的线程中接到到。在开立新的线程时,新线程将会继续父线程的实信号掩码,由此一旦在三个线程上围堵某些实信号,那么在它所创办的线程中也会阻塞该实信号。

能够通过频域信号掩码来支配哪个线程接收数字信号,比如,创立一个线程,该线程的独一指标是捕获有些特定的时域信号而且做出响应:在理事务中阻塞确定性信号;那时该时域信号会在职分组中被有着的线程阻塞。在贰个“确定性信号管理线程”中,使能了复信号,那个线程将是独一接收随机信号的线程。

理当如此想一上来就深入分析数据结构,看了一圈源代码,发掘依然先从应用层的API动手,有个健全的认知后,再逐层去剖判底层的原理。

API如下:

QNX相关历史篇章:

  • QNX简介
  • QNX Neutrino微内核
  • QNX IPC机制
  • QNX进度管理器

QNX相关历史篇章:

  • QNX简介
  • QNX Neutrino微内核
  • QNX IPC机制

咱俩什么样树立叁个巡回的buf,当有新数据,存款和储蓄在风行的职位,以便访问。

栈:

int sigemptyset(sigset_t *set) ; /* 清空set信号集, 排除所有信号 */int sigfillset(sigset_t *set); /* 置位set信号集,包含所有信号 */int sigaddset(sigset_t *set, int signo); /* 将信号signo添加进set信号集 */int sigdelset(sigset_t *set, int signo); /* 将signo信号从set信号集中删除 */int sigismember(const sigset_t *set, int signo); /* 判断signo信号是否属于set信号集 */int sigaction(int signo, const struct sigaction *act, struct sigaction *oact); /* 信号安装函数,将sigaction与一个特定的信号进行绑定,sigaction结构体在下文会介绍 */int sigignore(int signo); /* 忽略signo信号 */void (*sigset(int signo, void ; /* 改变signo信号的配置, disp可以是SIG_DFL、SIG_IGN,或者信号处理Handler */int sigprocmask(int how, const sigset_t *set, sigset_t *oset); /* 根据how的策略,来改变当前阻塞的信号集 */int sighold(int signo); /* 将signo信号添加进进程的阻塞信号集 */int sigrelse(int signo); /* 将sigo信号从进程的阻塞信号集中移除 */int sigpending(sigset_t *set); /* 返回在阻塞期间收到的阻塞信号的集合 */int sigsuspend(const sigset_t *set); /* 在接收到某个信号之前,临时用set替换进程的信号掩码,并暂停进程执行,直到收到信号为止 */int sigpause(int signo); /* 将signo信号从信号掩码中移除,暂停进程,直到收到信号为止 */int sigwaitinfo(const sigset_t *set, struct siginfo *info); /* 调用的sigtimedwait */int sigtimedwait(const sigset_t *set, struct siginfo *info, const struct timespec *timeout); /* 将set作为阻塞信号集,当多个信号到达时,返回最小的返回,如果没有信号到达,在timeout时间内,进程会暂停,直到收到信号或者时间到期 */int sigqueue (int tid, int signo, union sigval value); /* 向tid Task发送signo信号,信号携带value数据 */int kill(pid_t pid, int sig); /* 向pid Task发送sig信号 */int pause; /* 暂停当前调用线程,直到收到一个non-blocked信号 */

QNX Neutrino允许客商编写进程当作财富管理器,并且能够动态的运维和甘休。那样的平价是足以收缩系统在运营时的内部存款和储蓄器供给,况兼可以灵活的回答定制化嵌入式系统中的种种设备。

在QNX Neutrino中,微内核与经过管理器一同构成procnto模块,全体运维时系统都亟待以此模块。

率先我们假如开采七个10*32轻重缓急的数组a[10][32],要是大家的数码没次是叁拾叁个byte,这大家能够存10组数据,当然越大越好,但貌似小型管理器未有那么多可操作空间。

1)从数据结构的角度来精晓,栈是一种描述先进后出的数据结构;

从上述接口中得以看看,大概能够分成以下几类:

  • 对时限信号集/时限信号自个儿的操作:譬喻非确定性信号集的清空与置位、将实信号从能量信号集中删除、扩充时域信号到随机信号集中、推断功率信号是不是属于复信号集等
  • 对能量信号的行事响应:比方首先须要时域信号安装、设置时限信号的Handler、忽略有个别功率信号、阻塞有个别频限信号、在收到到有些确定性信号前暂停当前历程(会提到到职务的切换)等
  • 发送功率信号:向某些特定的task发送能量信号,功率信号中还能够带领数量

数据结构又分为两有的:Kernel部分和User部分,在那之中Kernel部分也急需用到User部分的概念。

User部分,定义在include/signal.h中,首要描述实信号的主旨数据结构以及API接口

  • 随机信号集的定义,总共包含3第22中学国国投号,Nuttx提供了一部分实信号,其他的客户可以自定义

财富管理器平日担负向种种设备提供接口,这几个器械可能波及管理实际的硬件装置(比方串口、并口、网卡或磁盘驱动器)或编造设备(举个例子/dev/null、互联网文件系统、伪ttys等)

经过管理器可用以创建七个POSIX进度(每种进度大概富含五个POSIX线程),它的重要职分包蕴:

我们再定义二个wp变量,代表新数据的变量,即为每增添一组数据,wp 加1。

2)从进度的内部存储器空间角度来精通,栈是一种独特的内部存款和储蓄器段,用于寄放局地变量、函数参数、重返值等;

/* This defines a set of 32 signals (numbered 0 through 31). * REVISIT: Signal 0 is, however, not generally usable since that value has * special meaning in some circumstances (e.g., kill. */typedef uint32_t sigset_t; /* Bit set of 32 signals */#define __SIGSET_T_DEFINED 1/* Signal set management definitions and macros. */#define NULL_SIGNAL_SET (0x00000000)#define ALL_SIGNAL_SET (0xffffffff)#define MIN_SIGNO 0#define MAX_SIGNO 31#define GOOD_SIGNO (((<=MAX_SIGNO))#define SIGNO2SET (1 << /* A few of the real time signals are used within the OS. They have * default values that can be overridden from the configuration file. The * rest are all user signals. * * The signal number zero is wasted for the most part. It is a valid * signal number, but has special meaning at many interfaces (e.g., Kill. * * These are the semi-standard signal definitions: */#define SIGUSR1 1 /* User signal 1 */#define SIGUSR2 2 /* User signal 2 */#define SIGALRM 3 /* Default signal used with POSIX timers (used only */ /* no other signal is provided) */#define SIGCHLD 4 /* Used by child threads to signal parent thread */#define SIGPOLL 5 /* Sent when an asynchronous I/O event occurs *//* The following are non-standard signal definitions */#define SIGCONDTIMEDOUT 16 /* Used in the implementation of pthread_cond_timedwait */#define SIGWORK 17 /* Used to wake up the work queue */

在其他操作系统中,那么些效果平日与设备驱动程序相关联,与器械驱动程序区别的是能源管理器没有要求与基础实行耦合,看起来更疑似客户级程序。

  • 经过管理,管理进程的创立、销毁、属性管理等;
  • 内部存款和储蓄器管理,管理一种种的内部存款和储蓄器爱护作用、共享库、过程间POSIX分享内部存储器等;
  • 路径名管理,管理能源管理器大概叠合到的路子名空间;

那般大家的数组便知道存款和储蓄的空间占了稍稍,还余多少。

率先种角度,用来说述本人的表征,第三种角度,是将这种数据结构的性状用于实际的内部存储器空间中。

  • 功率信号事件的概念,重要用于向消息队列发送信号,通告某些task队列中曾经有新闻了

财富管理器是客户级的服务器程序,它接受来自另外程序的央求服务,并可选的与硬件举办通讯。QNX Neutrino强大和灵活的地面IPC机制,能够让财富管理器与内核解耦合。

客商进度能够透过基础调用访谈微内核函数,也能够因此向procnto发送新闻来访谈进度管理器函数。在procnto中实行线程去调用微内核的点子与其余进度中的线程完全同样,进程管理器代码和微内核分享一样的地方空间并不意味有一套特种的或个体的接口,系统中的全体线程分享同样的基础接口,并且在调用内核时实践特权切换。

每一趟存新的数码地方在&a[wp][0]。

栈帧:每种过程都会有和谐的栈空间,而经过中的各样函数也会珍惜和煦小编的一个栈的区域,这一个区域就是栈帧。那么二个函数的栈帧的区域是什么样来界定的啊?当然,笔者第一会推广ARM的多少个特殊寄放器效用。

/* Values for the sigev_notify field of struct sigevent */#define SIGEV_NONE 0 /* No asynchronous notification is delivered */#define SIGEV_SIGNAL 1 /* Notify via signal,with an application-defined value */#ifdef CONFIG_SIG_EVTHREAD#define SIGEV_THREAD 3 /* A notification function is called */#endif/* This defines the type of the siginfo si_value field */union sigval{ int sival_int; /* Integer value */ FAR void *sival_ptr; /* Pointer value */};/* This structure contains elements that define a queue signal. The following is * used to attach a signal to a message queue to notify a task when a message is * available on a queue */#ifdef CONFIG_CAN_PASS_STRUCTStypedef CODE void (*sigev_notify_function_t)(union sigval value);#elsetypedef CODE void (*sigev_notify_function_t)(FAR void *sival_ptr);#endifstruct sigevent{ uint8_t sigev_notify; /* Notification method: SIGEV_SIGNAL, SIGEV_NONE, or SIGEV_THREAD */ uint8_t sigev_signo; /* Notification signal */ union sigval sigev_value; /* Data passed with notification */#ifdef CONFIG_SIG_EVTHREAD sigev_notify_function_t sigev_notify_function; /* Notification function */ FAR pthread_attr_t *sigev_notify_attributes; /* Notification attributes  */#endif};

鉴于QNX Neutrino是一个布满式微内核操作系统,大概具有非内核成效都由客商可设置的顺序提供,由此顾客端程序与能源管理器之间须求三个定义清晰与美好的接口,并对财富处理器的意义扩充文书档案化。

procnto的首要任务便是动态创设新进程,创立的长河也会凭仗procnto提供的内存管理和路线名管理有关作用。进度管理包含进程创建、销毁、属性(进度ID、客户ID、组ID)管理。包涵以下接口:

接下来大家在装置三个访谈变量 rp,用来读取以前存款和储蓄的数据。每访谈一遍rp 加1.

R11:frame pointer,FP寄存器

  • 复信号的定义,描述时限信号的当中细节音信,用于在复信号Handler中的参数字传送递

在路子名空间映射中,进度处理器会将路线名和能源管理器进行映射绑定,比方串口能够由能源管理器devc-ser*管理,可是其实的路线名空间中名字为dev/ser1,能够因而张开dev/ser1来获得串口服务。

  • posix_spawn(),POSIX接口,通过直接钦点要加载的可施行文件来创立子进度。熟悉UNIX系统的人唯恐明白,那一个函数也正是在fork()自此调用exec*(),然而更飞快,因为没有须要在像fork()函数中那样须要复制地址空间,而是在exec*()调用时直接销毁和顶替;

  • spawn(),QNX Neutrino接口,功能类似于posix_spawn(),使用这么些接口能够决定进程的性质消息,比方文件描述符、进度组ID、模拟信号、调节攻略、调节优先级、仓库、运转掩码;

  • fork(),POSIX接口,创立子进程,子进度与父进度分享一样的代码,并复制父进程的多少。大多数的进程财富都以往续的,不能够三回九转的资源包括:进程ID、父进度ID、文件锁、pending能量信号和alarms,计时器。fork()函数能够在二种情状下行使:

每回访问的地方地点&a[rp][0]。

R12:IP存放器,用于暂存SP

/* These are the possible values of the signfo si_code field */#define SI_USER 0 /* Signal sent from kill, raise, or abort */#define SI_QUEUE 1 /* Signal sent from sigqueue */#define SI_TIMER 2 /* Signal is result of timer expiration */#define SI_ASYNCIO 3 /* Signal is the result of asynch IO completion */#define SI_MESGQ 4 /* Signal generated by arrival of a message on an */ /* empty message queue */#define CLD_EXITED 5 /* Child has exited (SIGCHLD only) */#define CLD_KILLED 6 /* Child was killed (SIGCHLD only) */#define CLD_DUMPED 7 /* Child terminated abnormally (SIGCHLD only) */#define CLD_TRAPPED 8 /* Traced child has trapped (SIGCHLD only) */#define CLD_STOPPED 9 /* Child has stopped (SIGCHLD only) */#define CLD_CONTINUED 10 /* Stopped child had continued (SIGCHLD only) *//* The following types is used to pass parameters to/from signal handlers */struct siginfo{ uint8_t si_signo; /* Identifies signal */ uint8_t si_code; /* Source: SI_USER, SI_QUEUE, SI_TIMER, SI_ASYNCIO, or SI_MESGQ */ uint8_t si_errno; /* Zero or errno value associated with signal */ union sigval si_value; /* Data passed with signal */#ifdef CONFIG_SCHED_HAVE_PARENT pid_t si_pid; /* Sending task ID */ int si_status; /* Exit value or signal (SIGCHLD only). */#endif};typedef struct siginfo siginfo_t;#define __SIGINFO_T_DEFINED 1

编写制定贰个财富管理器有以下多少个原因:

  1. 创建当前实践意况的新实例,可用pthread_create()替代;
  2. 创办叁个运营区别程序的新历程,可用posix_spawn()来替代;

当未有新数据wp甘休更新,等到rp=wp,代表享有数据读取完结。

R13:stack pointer,SP寄存器

  • 非确定性信号action的概念,当时域信号deliver的时候,Task所使用的步履,当中sigaction中sa_mask位域,表示的是当Handler在施行时期,必要阻塞的时限信号
  • 客商端应用POSIX接口与能源管理器通讯;
  • 能够减掉接口类型的数额,当有众多服务器进程时,将服务器进度都编写成能源管理器,能够最大化收缩顾客端须求动用的接口数量;
  • 能够应用命令行工具与能源管理器通讯,比如cat /proc/my_status,也足以采纳命令去测验驱动程序;
  • vfork(),UNIX BSD扩张接口,vfork()只可以在单线程进度中调用。vfork()函数与fork()函数不一致之处在于,它与父进程分享数据段,在调用exec*()exit()函数此前数据都以分享的,调用exec*()exit()函数之后父进度本领运维;

  • exec*(),POSIX接口,exec*()数不完函数,会用可推行文件加载的新历程,替换当前进程,由于调用进程被替换,因而不会有成功重返。这一个函数常常用在fork()vfork()而后,用于加载子进度。更加好的艺术是利用posix_spawn()接口。

当wp=10,预先设定的数组满了,再往下存就溢出了,此时将在从头开头存款和储蓄到a[0][0]mg4155线路检测手机版 ,的位置。

R14:link register,LR寄存器

/* struct sigaction flag values */#define SA_NOCLDSTOP (1 << 0) /* Do not generate SIGCHILD when * children stop  */#define SA_SIGINFO (1 << 1) /* Invoke the signal-catching function * with 3 args instead of 1 * (always assumed) */#define SA_NOCLDWAIT (1 << 2) /* If signo=SIGCHLD, exit status of child * processes will be discarded *//* Special values of of sa_handler used by sigaction and sigset. They are all * treated like NULL for now. This is okay for SIG_DFL and SIG_IGN because * in NuttX, the default action for all signals is to ignore them. */#define SIG_ERR ((_sa_handler_t)-1) /* And error occurred */#define SIG_DFL ((_sa_handler_t)0) /* Default is SIG_IGN for all signals */#define SIG_IGN ((_sa_handler_t)0) /* Ignore the signal */#define SIG_HOLD ((_sa_handler_t)1) /* Used only with sigset() *//* Non-standard convenience definition of signal handling function types. * These should be used only internally within the NuttX signal logic. */typedef CODE void (*_sa_handler_t)(int signo);typedef CODE void (*_sa_sigaction_t)(int signo, FAR siginfo_t *siginfo, FAR void *context);/* The following structure defines the action to take for given signal */struct sigaction{ union { _sa_handler_t _sa_handler; _sa_sigaction_t _sa_sigaction; } sa_u; sigset_t sa_mask; int sa_flags;};/* Definitions that adjust the non-standard naming */#define sa_handler sa_u._sa_handler#define sa_sigaction sa_u._sa_sigaction

诚如能够将能源处理器分为两类:

在少数实时内核中,会在支付条件中提供内部存款和储蓄器爱慕接济,并不是常少为运营时布署提供内部存款和储蓄器保养,原因是内部存款和储蓄器和总体性的损失。随着内部存款和储蓄器爱护在数不清嵌入式管理器中更为宽广,内部存款和储蓄器珍贵的益处远远超过了它推动的品质损失,最重大的某个正是进步了软件的鲁棒性。内部存款和储蓄器爱慕对地方空间实行了隔绝,幸免了二个历程中的错误影响其余进度或基本。启用MMU后,操作系统能够在发出内部存款和储蓄器访问争持时停顿进程,并当即反馈给程序员,并不是在运作一段时间后陡然崩溃。

本文由mg4155com发布于mg4155线路检测手机版,转载请注明出处:循环缓存区的兑现原理,QNX财富管理器

关键词:

上一篇:没有了

下一篇:没有了