c语言大杂烩(记录自己学到的内容)

1.c语言函数传递指针参数的问题-----L_Aster
想用函数来对函数外的变量v进行操作,对函数来说所传递的任何参数仅仅是原来参数的一个拷贝,只能通过传递指针改变值。
形式参数是一个指针,但是它指向的是另一个指针,也就是实参的地址
C语言–数组名,取数组首地址的区别
–Joohong
&array是整个数组array的首地址
array是数组首元素的首地址
2.c语言中指针和指针变量的区别是什么
指针是概念,指针变量是具体实现
系统为每一个内存单元分配一个地址值,c/c++把这个地址值称为指针,int i = 5,存放变量i的内存单元的编号&i被称为指针
指针变量存放上诉地址值的变量,是存放变量所占内存空间首地址的变量,因为一个变量通常要占用连续的多个字节的空间。int p=&i,就把i的指针&i赋给int型的指针变量p
3.c语言再学习–段错误(核心已存储)–聚优致成
一。什么是段错误,一旦一个程序发送了越界访问,cpu就会产生相应的保护,于是segmentation fault就出现了,段错误就是访问了不可访问的内存
二。段错误的原因有;
1.非关联化空指针
2.试图访问一个不存在的内存空间(在进程的地址空间)
3.视图访问内存的程序没有权利(如内核结构流程的上下文)
4.试图写入只读存储器(如代码段)
1.访问不存在的内存空间
*数组指针和指向二维数组的指针变量(p)[N]
二维数组相当于一个特殊的一维数组里面每一个元素又是一个一维数组。设p是指向二维数组a[m][n]的指针变量,那么
int*p = a[0];此时p是指向一维数组的指针,p++后,p指向a【0】【1】。
如果定义int(*p1)[n];p1 = a;p1++后,p1指向a[1][0];

对于a数组中任一元素a【i][j],指针的一般形式为*(p+iN+j)
相应的如果用p1来表示,则为(
(p1+i)+j)

发现一个大佬博客(fovwin)现在来吹吹他的博客先
分析TCP/iP协议栈代码之UDP(STM32平台)
UDP是一个简单的面向数据报的传输层协议:进程的每一个输出操作都正好产生一个UDP数据报,并组装成一份待发送的ip数据报,这与面向流字符的协议如tcp有所不同
16位源端口号,16位目的端口号,16位udp长度,16位udp检验和,
IP层已经将IP数据报分配给TCP或UDP(更具IP首部中协议字段值)
UDP长度字段指的是UDP首部和UDP数据的字节长度。该字段长度最小值为8字节。IP数据报长度指的是数据报全长。因此udp数据报长度是全长减去IP首部的长度。udp检验和覆盖udp首部和数据,16bit字的二进制反码和,udp数据报的长度为奇数字节。
udp数据报和tcp段都包含一个12字节长的伪首部。四字节源ip地址和4字节目的ip地址,利用ip首部的尾巴,实现空间上的复用。目的是让udp两次检查数据是否已经正确到达目的地。(Ip没有接受地址不是本主机的数据报,以及ip没有把应传给另一高层的数据报传给udp。
IP数据报是指IP层端到端的传输单元(在分片和重新组装之后),分祖是指ip层和链路层之间传送的数据单元。一个分祖可以是一个完整的ip数据报,也可以是一个分片,
实时操作系统概述(推荐)------fovwin
现代操作系统则是在单处理器上引入了多任务机制,每个用户的应用程序可以设计成多个不同任务,每个任务都是一个软件模块。并发执行,提高系统的吞吐量,更加有效利用系统资源。对于较小的实时操作系统:
只需要使用实时监控程序monitor既可以简单而有效的进行运行和管理。监控程序管理应用程序的运行和对io设备的操作,并且按优先级控制哦的中断系统。被硬件激活等各项功能可以由中断服务程序来完成。
实时多任务执行程序称为内核,对于复杂的必须使用文件系统在内的完全的实时多任务操作系统。
一个操作系统可以定义为:使得计算机系统的硬件称为可用的,由软件或固件所实现的一个程序集。传统的通用操作系统通常包括以下几个部分:命令解释程序,内核和I/O设备驱动程序。它所提供的运行即管理机制为:
–多任务的管理
–内存及资源管理
–任务间的信息传递
–文件系统的管理
–逻辑i/o设备的管理
实时是指物理进程的真实时间,首要任务·就是调度一切可利用的资源完成实时控制任务。
早期实时操作系统:一般为用户提供对系统的初始化管理以及简单的实时时钟管理,有的实时监控程序也引入了任务调度及简单的任务间协调功能。后来可以自己研制与硬件想匹配的操作系统但移植性不好。一些多任务机制如基于优先级的调度,实时时钟管理,任务间的通信,同步互坼即构等基本上是相同的,不同的只是面向各自的硬件环境和应用目标。以一个个标准组件构成通用的实时操作系统,在RTOS内核最底层将不同硬件特性屏蔽掉。
通用实时操作系统:一般实时操作系统提供了开发,调试,运用一致的环境
嵌入式实时用到奥德是开发环境与运行环境不一致
(评价一个实时操作系统可以从任务调度,内存管理,任务通讯,内存开销,任务切换时间,最大中断禁止时间)
1.可确定性
任务请求由外部事件和时间安排来描述
从高级优先级中断到达开始服务之间的延迟
**相应性
确定性关注的操作系统获知一个中断之前的延迟,相应性关注的在知道中断之后操作系统为中断提供服务的时间。
用户控制
可靠性
故障弱化运行(稳定性)—快速任务切换,当一个任务退出运行时,RTOS保存它的运行现场信息,插入相应队列,调度算法选择一个任务投入运行,任务切换时间。
多任务有关:
1。使用特殊的顺序文件,可以快速存储数据
2.基于优先级的抢占调度
3.最小化禁止中断的时间间隔
当rtos运行在核态或执行某些系统调用的时候,是不会因为外部中断的到来而中断执行的,只有重新回到用户态时才相应外部中断请求。
**嵌入式系统标准-posix
缺乏一个公共的应用接口api,经常出现两个是实现不同在于函数和语法的名称。posix全称为可移植性unix操作系统接口,完整系统标准,ieee 1003.1

内核·负责管理各个任务,或者说为每个任务分配cpu时间,并负责任务间特性,基本任务时任务切换。内核允许将应用程序分成若干个任务,代码空间增加rom,内核本身数据结构增加ram,每个任务都要由自己的堆栈空间,占内存很大。内核是整个操作系统的基础。实时内核时操作系统的一部分。实时内核设计要考虑轮询,协调,中断驱动以及前后台,支持包括
微内核退出只保留进程间通信,任务调度,低级春初管理和中断处理,把其他操作系统概念都变为一个个用户态的服务器

待续—实时操作系统概述(推荐)—fovwin

STM32学习笔记–GPIO之从库函数到寄存器
//这段程序的流程:首先检查由结构体变量GPIO_InitStructure所传入的参数是否
//正确,然后对GPIO寄存器进行“读出->修改->写入”操作,完成对GPIO设备的配置工作

//总结起来就是:(1)固件库首先将各个设备所有的寄存器的配置字进行于定义
//在stm32f10x.h
//然后封装在结构或枚举变量中(存在相对应的stm32f10x.xxx.h,其中xxx代表
//gpio,spi,exti等外设模块),待用户调用对应的固件库函数时,会根据用户传入的参数
//从这些封装好的结构体或枚举变量中取出对应的配置字,最后写入寄存器中,完成对底层寄存器
//的配置

stm32 寄存器操作一看就会----yangyaokun0220
/以太网数据报架构----Firefly_cjd/

-------------------[深入实践ucos-ii】开篇-----arvik---------
usoc-ii没有所谓的应用层和内核层,不需要CPU支持内存保护,程序和内核在一个级别上运行,一套具有上下文切换功能(任务调度)的代码就可以称为操作系统了,其他如信号量,互坼锁,消息队列,邮箱,实践管理,内存管理或文件系统,图形界面只能算是附属功能。


uCOS -III任务堆栈溢出检测及统计任务堆栈使用量的方法—
http://blog.csdn.net/zsy2020314/article/details/9699887
堆栈的大小取决于改任务的需求,所有可能被堆栈调用的函数及函数的嵌套层次,相关局部变量的大小,中断服务程序所需要的空间。堆栈还需要存入CPU寄存器,避免写递归函数。
2.uCOS-III任务堆栈溢出检测原理
每个任务都有自己的TCP(任务控制块),TCP中有个StkLimitPtr成员)。假设在切换到任务S前,代码会自动检测被载入CPU堆栈指针的值是否超出改任务S的TCP中StkLimitPtr限制,因为软件不能再溢出时迅速做出反应,所有应该设置StkLimitPtrd的值尽可能远离&MyTaskStk
【0】,保证有足够缓存。当uC/OS-III从一个任务切换到另一个任务时候,它会调用一个hook函数OSTaskSwHook(),允许用户狂涨上下文切换的功能,如果处理器没有硬件支持溢出检测功能,就可以再该hook函数中添加代码软件模拟该能。通常设置StkLimitPtr指向任务栈大小90%100,然后获取任务栈使用量。
used+free=栈总量 栈使用前会被初始化为0,栈统计原理就是统计连续区域为0的区域大小。
==详解uc/os-ii如何
检测任务堆栈实际使用情况–

–UCOS III任务堆栈理解—
1.堆栈就是一段连续的空间,用于存储数据,比如中断时保护现场,c语言函数调用时保护现场和临时变量。
2.堆栈指针就是一个数据指针,计算机自己更改指针指向的位置来保存数据,操作系统做任务切换。
堆栈作用就是用来保存局部变量,从实质上讲将cpu寄存器的值保存到ram中。在ucos中每一个任务都有一个独立的任务堆栈。

—假设TPrint最初由OSTaskCreate()函数创建,在函数中与任务堆栈有关的第一段代码就是大家比较熟悉的函数OSTaskStkInit(),初始化堆栈。起始就是预先在RAM中的一块区域中把任务将来运行开始时CPU寄存器应处的状态(正确值)准备好,之后,任务第一次被内核调度器调度运行时,将这些准备好的数据推入到CPU寄存器中,如果数据涉及合理,CPU便会按照我们预先涉及好的思路与运行。
(第一:当任务挂起时,它用来保存一些局部变量;
第二:当任务挂起时,它负责保存任务的运行现场,也就是CPU寄存器的值。)
任务状态:万事具备(事件和信号),东风(CPU控制权)

你可能感兴趣的:(c语言大杂烩(记录自己学到的内容))