![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
OS篇
文章平均质量分 97
郭忠伟-写录
总结|记录.
电力行业,扎根,参与开发:融合终端|能源控制器|集中器|采集器|拓扑识别设备.
涉及协议:mqtt,698,10x,3761,13762,645等.
联系方式:
邮箱:guozhongwl@163.com
微信:ai-3456------596---
展开
-
linux shell脚本语法笔记(待续)
文章目录反引号单引号''双引号""单小括号 ()双小括号 (( ))单中括号 []双中括号[[ ]]反引号引用命令如果需要调用命令的输出,或把命令的输出赋予变量,则命令必须使用反引号包含,这条命令才会执行,反引号的作用和 $(命令) 是一样的,但是反引号非常容易和单引号搞混,所以推荐大家使用 $(命令) 的方式引用命令的输出。单引号’’关闭所有的特殊字符功能,使特殊字符变成普通字符,不...原创 2020-04-13 19:58:15 · 196 阅读 · 0 评论 -
ping lwip网络协议栈 分析(二)
网卡ENC28J60自动填充短针至60字节:enc28j60WriteOp(ENC28J60_WRITE_BUF_MEM, 0, 0x00);将包控制字节的bit 0位==设置为0(低),于是决定了:MACON3中的值用于确定数据包发送的方式。enc28j60WriteOp(ENC28J60_BIT_FIELD_SET, MACON3, MACON3_PADCFG0|MACON3_TXCRCEN|MACON3_FRMLNEN|MACON3_FULDPX);“用 0填充所有短帧至 60字节长,并追加一原创 2015-12-25 21:15:07 · 757 阅读 · 0 评论 -
细说#Pragma Pack(n)与内存对齐
数据结构对齐与#pragma pack(n)之间的约束:关于 #pragma pack(n)与复合类型的数据(常见于结构体、数组等)对其方式约束,流传两种类型的解释:解释一:每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。程序员可以通过预编译命令#pragma pack(n),n=1,2,4,8,16来改变这一系数,其中的n就是你要指定的“对齐系数”。 规则: 1. 数据成员原创 2016-06-13 23:27:26 · 828 阅读 · 0 评论 -
ucosIII OS_TYPE.H /OS_CFG_APP.H 解释
ucosIII User's Manual.pdf 文档,μC/OS-III Configuration Manual章节B-2 B-3 翻译,以进一步了解ucosIII 的移植及裁剪。OS_CFG_INT_Q_SIZEOS_CFG_INT_Q_TASK_STK_SIZEOS_CFG_TASK_STK_LIMIT_PCT_EMPTYOS_CFG_MSG_POOL_SIZE翻译 2016-07-06 18:10:33 · 2679 阅读 · 0 评论 -
ucosIII OS_CFG.H 解释
UCOS-III中的OS_CFG.H 详细解释想要对ucos 的功能进行裁剪,必不可少的需要了解OS_CFG.H 文件。这里对官方的《ucosIII User's Manual.pdf》文档,B-1 μC/OS-III FEATURES (OS_CFG.H)章节,进行简要的翻译,如有歧义,以原文为主。OS_CFG_PEND_MULTI_ENOS_CFG_APP_HOOKS_ENOS_CFG_CALLED_FROM_ISR_CHK_ENOS_CFG_DBG_ENOS_CFG_ISR_POST_D翻译 2016-07-05 10:41:57 · 5465 阅读 · 0 评论 -
嵌入式系统开发-操作系统-归档--系统任务框架设计原则
多任务划分方法与原则:谈几点多任务的划分原则: 任务划分是必须清楚的认识到任务的性质和特点然后根据具体的特点对人物的优先级、堆栈等运行属性进行划分。 降低任务间的耦合度:即降低任务间的通信。每个任务就相当于一个零件。当这个零件和其他的零件之间的关系非常小的时候,它才可能更通用。设备依赖性:无论是通信,还是采集亦或是控制类任务都对设备具有不同程度的依赖性,同时因为外部设备的特点不同将...转载 2018-04-21 23:13:55 · 288 阅读 · 0 评论 -
再读 ucosII源码(邵贝贝):任务之间的通讯与同步--信号量
µC/OS-II中的信号量由两部分组成: 一个是信号量的计数值,它是一个16位的无符号整数(0 到65,535之间); 另一个是由等待该信号量的任务组成的等待任务表。 用户要在OS_CFG.H中将OS_SEM_EN开关量常数置成1,这样µC/OS-II才能支持信号量。 在使用一个信号量之前, 首先要建立该信号量,也即调用OSSemCreate()函数,对信号量的初始计数值赋值。该初始值为...原创 2018-04-30 15:52:19 · 659 阅读 · 0 评论 -
再读 ucosII源码(邵贝贝):任务之间的通讯与同步--邮箱
邮箱简介:邮箱是µC/OS-II中另一种通讯机制,它可以使一个任务或者中断服务子程序向另一个任务发送一个指针型的变量。 该指针指向一个包含了特定“消息”的数据结构。为了在µC/OS-II中使用邮箱,必须将OS_CFG.H中的OS_MBOX_EN常数置为1。 使用邮箱之前,必须先建立该邮箱。 该操作可以通过调用OSMboxCreate()函数来完成,并且要指定指针的初始值。 一般情况下,...原创 2018-05-01 12:49:20 · 991 阅读 · 0 评论 -
再读 ucosII源码(邵贝贝):任务之间的通讯与同步--消息队列
消息队列 简介消息队列是µC/OS-II中另一种通讯机制,它可以使一个任务或者中断服务子程序向另一个任务发送以指针方式定义的变量。 因具体的应用有所不同,每个指针指向的数据结构变量也有所不同。 为了使用µC/OS-II的消息队列功能,需要在OS_CFG.H 文件中,将OS_Q_EN常数设置为1,并且通过常数OS_MAX_QS来决定µC/OS-II支持的最多消息队列数。在使用一个消息队列...原创 2018-05-01 15:44:55 · 2176 阅读 · 1 评论 -
嵌入式系统开发-操作系统-归档--为何需要操作系统
为什么要使用操作系统?也就是使用嵌入式操作系统有什么好处?理论上来讲,操作系统介于硬件(驱动程序)与软件(用户应用程序)之间。操作系统之上的软件开发人员,不需要与硬件打交道。 1、操作系统可以降低开发难度。 软甲开发者,不需要与硬件打交道,不需要懂硬件。另外, 操作系统帮我们协调多个程序之间的耦合关系,比如我们需要将串口的接收到的数据显示在一块LCD上。传统做法是如图: 该流程中当...转载 2018-04-21 22:54:51 · 1063 阅读 · 0 评论 -
再读 ucosII源码(邵贝贝):内核结构
本章给出μC/OS-Ⅱ的主要结构概貌: - μC/OS-Ⅱ是怎样处理临界段代码的; - 什么是任务,怎样把用户的任务交给μC/OS-Ⅱ; - 任务是怎样调度的; - 应用程序CPU的利用率是多少,μC/OS-Ⅱ是怎样知道的; - 怎样写中断服务子程序; - 什么是时钟节拍,μC/OS-Ⅱ是怎样处理时钟节拍的; - μC/OS-Ⅱ是怎样初始化的,以及 - 怎样启动多任...原创 2018-04-26 19:58:28 · 2042 阅读 · 0 评论 -
再读 ucosII源码(邵贝贝):内核结构--任务控制块(Task Control Blocks, OS_TCB)
此文,供 再读 ucosII源码(邵贝贝):内核结构 使用。OS_TCB定义:一旦任务建立了,任务控制块OS_TCB将被赋值。任务控制块是一个数据结构。 当任务的CPU使用权被剥夺时,μC/OS-Ⅱ用它来保存该任务的状态。 当任务重新得到CPU使用权时,任务控制块能确保任务从当时被中断的那一点丝毫不差地继续执行。 OS_TCB全部驻留在RAM中。 OS_TCB源码结构如下:...原创 2018-04-26 16:27:45 · 734 阅读 · 0 评论 -
再读 ucosII源码(邵贝贝):任务管理
任务管理:任务可以是一个无限的循环,也可以是在一次执行完毕后被删除掉。这里要注意的是,任务代码并不是被真正的删除了,而只是µC/OS-Ⅱ不再理会该任务代码,所以该任务代码不会再运行。任务看起来与任何C函数一样,具有一个返回类型和一个参数,只是它从不返回。任务的返回类型必须被定义成void型。在本章中所提到的函数可以在OS_TASK文件中找到。 除了系统得空闲任务,任务必须是以下两种结构之一:...原创 2018-04-26 20:12:16 · 627 阅读 · 1 评论 -
再读 ucosII源码(邵贝贝):时间管理
时间管理前文描述过, 时钟的中断服务子程序调用节时钟节函数OSTimeTick——该函数用于通知µC/OS-Ⅱ发生了时钟节拍中断。 相关的函数见下文,源码于os_time.c中.任务延时函数,OSTimeDly()µC/OS-Ⅱ提供了这样一个系统服务: 申请该服务的任务可以延时一段时间,这段时间的长短是用时钟节拍的数目来确定的。实现这个系统服务的函数叫做OSTimeDly()...原创 2018-04-28 09:47:58 · 370 阅读 · 0 评论 -
再读 ucosII源码(邵贝贝):任务之间的通讯与同步
µC/OS-II中,保护任务之间的共享数据和提供任务之间的通讯的5种方法:利用宏OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()来关闭中断和打开中断。当两个任务或者一个任务和一个中断服务子程序共享某些数据时,可以采用这种方法利用函数OSSchedLock()和OSSchekUnlock()对µC/OS-II中的任务调度函数上锁和开锁。用这种方法也可以实现数据的共...原创 2018-04-28 14:18:02 · 622 阅读 · 0 评论 -
HardFault_Handler异常排查处理方案
原理:cortex-M3内核,异常发生时,内核将R0~R3、R12、LR、PC、XPRS 寄存器依次入栈,其中LR即为发生异常前PC将要执行的下一条指令地址。发生异常之后可首先查看LR寄存器中的值,确定当前使用堆栈是MSP还是PSP,然后找到相应堆栈的指针,并在内存中查看相应堆栈里的内容。注意:寄存器均是32位,且STM32是小端模式。(参考Cortex-M3权威)HardFault...原创 2019-03-12 13:13:45 · 2384 阅读 · 1 评论 -
lwip TCP客户端 tcp_connect函数源码解析
lwip TCP客户端 tcp_connect函数源码解析原型: struct tcp_pcb * tcp_new (void)原型: err_t tcp_bind(struct tcp_pcb *pcb, struct ip_addr *ipaddr, u16_t port)#define tcp_listen(pcb) tcp_listen_with_backlog(pcb, TCP_DEFAULT_LISTEN_BACKLOG)控制块连接 对于客户端程序来说,需要执行主动打开操作,就是向原创 2016-01-08 15:59:34 · 5083 阅读 · 0 评论 -
字节对齐算法
算法实现:#define MEM_ALIGNMENT 4 //使用4字节对齐模式#define SIZEOF_STRUCT_MEM LWIP_MEM_ALIGN_SIZE(sizeof(struct mem))/** Calculate memory size for an aligned buffer - returns the next highest *...原创 2015-12-30 17:01:48 · 877 阅读 · 0 评论 -
临界代码区 与 中断
1、 代码的临界区 代码临界区指操作系统在处理时不可分割的代码。一旦这部分代码开始执行,则不允许任何中断打扰。为确保临界段代码的执行,在进入临界段之前要关中断,而临界段代码执行完以后要立即开中断。如下关于A/D采样的代码中有这么一段:Int main(){ _DINT(); WDTCTL=WDTPW+WDTHOLD; InitClock(); InitAD12转载 2015-02-12 10:58:10 · 3208 阅读 · 0 评论 -
-----ARM汇编伪指令----
ARM 汇编程序的由机器指令,伪指令和宏指令组成。伪指令不像机器指令那样在处理器运行期间由机器执行,而是汇编程序对源程序汇编期间由汇编程序处理。在前面的指令集章节中,我们已经接触了几条常用到的伪指令,如ADR 、ADRL、LDR、NOP 等,把它们和指令集一起介绍是因为它们在汇编时会被合适的机器指令代替,实现真正机器指令操作。宏是一段独立的程序代码,它是通过伪指令定义的,在程序中使用宏指令即可调用转载 2015-03-20 14:47:51 · 2759 阅读 · 0 评论 -
MDK + STM32固件库 启动文件startup_stm32f10x_hd.s功用及注释
MDK + STM32固件库 启动文件startup_stm32f10x_hd.s功用及注释 Set the initial SP --设置初始化堆栈指针(SP)Set the initial PC == Reset_Handler---设置初始化 程序计数器(PC) == 复位中断服务程序地址分支到C库的__main(最终调用main())CortexM3处理器复位后进入线程模式,享有特殊优先级(特权级别),堆栈设置为MSP主堆栈堆栈以及堆的初始化/定义中断向量表/调用Reset Handler原创 2015-03-20 14:13:56 · 7505 阅读 · 3 评论 -
C指针+ STM32 理解
环境:IAR + Cortex-M3的处理器关注:指针在寄存器层次上的存储、调用、使用等。。。示例代码如下:int yyy=16;int *ptr1 = &yyy;int **ptr2 = &ptr1;int (*ptr3)[3];int *(*ptr4)[4];int main(){ ................ //使用这几个变量 .原创 2015-04-30 18:16:39 · 4687 阅读 · 0 评论 -
uCOS 就绪表实现方法解析
框图:对于拥有63个优先级的ucos系统,就绪表如下对于任务最高优先级=63的ucos系统,就绪表如下上图可看出,需要的数据至少包括:OSRdyTbl,OSRdyGrp;为了实现更可控的、便捷的添加、删除、查找等就绪表相关操作,增加了OSMapTbl、OSUnMapTbl。相关的变量、数组源码:OSRdyTbl数组:就绪表 --任务优先级 列INT8U OSRdyTbl[8...原创 2015-05-13 00:18:57 · 815 阅读 · 0 评论 -
ARM Cortex-M3体系结构
来自 ARM Cortex-M3处理器体系结构.PPT定位:概况:Cortex-M3处理器内核Cortex-M3处理器指令集Thumb-2Cortex-M3嵌套向量中断控制器NVICCortex-M3存储器管理存储器保护单元MPU总线接口调试跟踪接口开发软件和RTOSCortex-M3内核:转载 2015-05-06 19:06:51 · 4122 阅读 · 0 评论 -
大端小端格式详解
1. 什么是大端,什么是小端:所谓的大端模式,是指数据的低字节保存在内存的高地址中,而数据的高字节,保存在内存的低地址中;所谓的小端模式,是指数据的低字节保存在内存的低地址中,而数据的高字节,保存在内存的高地址中。2.为什么会有大小端:为什么会有大小端模式之分呢?这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个转载 2015-04-21 15:05:26 · 722 阅读 · 0 评论 -
ucosII实时操作系统 实现--问答》》待续
疑问: 何时发生调度? 怎么发生的调度?如何实现的,凭什么高优先级的任务到了,能够及时带走? 靠异常吗? 为什么从中断服务子程序出来后,可能会发生调度/切换?带着疑问,翻书+找源码,原创 2015-10-31 14:11:54 · 723 阅读 · 0 评论 -
malloc等分配内存函数探究
相关内存分配函数:malloc, calloc,free,realloc,brk常识普及:一个由C/C++编译的程序占用的内存(RAM)分为以下几个部分1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆...原创 2015-10-22 18:09:10 · 993 阅读 · 0 评论 -
实时操作系统
软实时和硬实时操作系统的区别: 解释一: 什么是真正的实时操作系统 1. 首先说一下实时的定义及要求:参见 Donal Gillies 在 Realtime Computing FAQ 中提出定义:实时系统指系统的计算正确性不仅取决于计算的逻辑正确性,还取决于产生结果的时间。如果未满足系统的时间约束,则认为系统失效。 http://www.faqs.org/faqs/realtime转载 2015-10-22 19:43:02 · 637 阅读 · 0 评论 -
cortex-M3 异常和中断
问题:1、如何开启、关闭中断2、如何开启、关闭异常3、程序只跳转一次时,把跳转需要返回地址直接存储在寄存器LR中。多次跳转呢?基础概述:操作模式:Cortex‐M3 支持 2 个模式和两个特权等级。handler模式和线程模式; 特权级和用户级。cortex-M3 寄存器组:Cortex‐M3 处理器拥有 R0‐R15 的寄存器组。其中 R13 作为堆栈指针 SP。SP 有两个,但在同一时刻只能...原创 2015-11-01 13:36:57 · 4832 阅读 · 0 评论 -
cortex-M3 的SVC、PendSV异常,与操作系统(ucos实时系统)
SVC异常是? PendSV异常是? ucos 任务切换时机? ucos 如何满足实时性(实现)? ucos中,systick的优先级?SVC和PendSVSVC(系统服务调用,亦简称系统调用)和PendSV(可悬起系统调用),它们多用于在操作系统之上的软件开发中。SVC:SVC 用于产生系统函数的调用请求。 例如,操作系统不让用户程序直接访问硬件,而是通过提供一些系...原创 2015-11-01 02:00:54 · 31422 阅读 · 14 评论 -
OS_CPU_A.ASM cortex-M3 解析
琢磨ucos内核进行中++>>>>>>>先上cortex-M3 与本部分相关的汇编指令相关的汇编指令至于相关伪指令,参见:-----ARM汇编伪指令----NVIC---Nested Vectored Interrupt controller--嵌套向量中断控制器这里给出NVIC寄存器映射:NVIC 空间还用来实现系统控制寄存器。NVIC 空间分成以下部分:原创 2015-11-02 14:13:44 · 4346 阅读 · 0 评论 -
uCOS任务堆栈的深入分析
堆栈作用的就是用来保存局部变量,从本质上讲也就是将CPU寄存器的值保存到RAM中。在uCOS中,每一个任务都有一个独立的任务堆栈。为了深入理解任务堆栈的作用,不妨分析任务从“出生”到“消亡”的整个过程,具体就是分析任务的建立,运行,挂起几种状态中任务堆栈的变化情况。现在假设系统运行着一个由用户创建的用以完成打印工作的任务TPrint。TPrint最初通过OSTaskCreate()函数创建转载 2015-11-19 17:29:38 · 631 阅读 · 0 评论