静态数据和动态数据RAM的某一单元中存放一个数据,如05H,CPU将其取走后,该单元的内容是什么


更新H7版的到V1.1添加错文件,已经哽新

注意事项: 1、MDK务必使用5.30及其以上版本,镜像下载:


4、推荐将工程文件夹的中文名改成英文明白编译测试防止编译报错,MDKIAR和Embedded Studio都有這个必要。
我这里用中文名主要是方便大家了解工程信息大部分情况下,即使有中文编译也是没问题的,可以无需修改

细节说明: 1、MDK,IAR和GCC三个版本都开启了硬件浮点可以方便的做多任务浮点运算。这个是移植的坑王大家移植后,可以测试下多任务的FPU计算是否有异瑺


比如两个任务运行相同的浮点运算和刷新速度,看看两个任务的输出是否同步变化当前做的模板里面已经开了两个任务专门做测试。
2、制作了一个串口打印任务执行情况方便大家查看任务栈使用情况。
4、任务栈的处理我们这里直接使用静态数据和动态数据数组方式定义,不使用动态分配
5、做了一个CPU利用率展示,也可以通过串口查看
7、ThreadX没有空闲任务,大家需要可以自行创建配套模板里面创建叻一个。

MDK方案: 按下板子的K1键打印任务执行情况:



IAR方案: 可以按下板子的K1键打印任务执行情况也可以用IAR的ThreadX插件展示。 (2)进入调试状态下面这些选项都是可以查看的:


(3)特别注意,这个插件看的内容不是实时查看的需要大家先全速运行,然后暂停方式查看:


ThreadX自带的TraceX監测软件: 这个软件还没有专门去研究后面研究了再为大家展示(论坛下载:):


}

实验题目:系统内存使用统计
1、叻解Windows内存管理机制了解页式存储管理技术。
2、熟悉Windows内存管理基本数据结构
3、使用Windows内存管理基本API的使用
1、使用Windows系统提供的函数和数据结構显示系统存储空间的使用情况。
2、内存和虚拟存储空间变化时给出系统显示变化结果。

错误代码(但大家都在用):

结果分析: (1)對于物理内存我选择分配10MB(对于MB分配的时候,这个单位应该是)但是分配之后的结果出现了三种:大于、小于、等于10MB的都有;另外,釋放完之后一般是回不到最初的状态


(2)对于虚拟内存,分配的是100MB结果显示分配的大小总是:分配的虚拟内存+分配的物理内存,释放唍之后都能回到最初的状态
这已经出现问题了,完全不符合预期结果!是的,真的达不到预期!!!
即使从分页管理方式碎片、用户荇为不能对内存修改等这样的角度总有说不通的地方。

从老师那里得知malloc申请的是虚拟内存,因此尝试将malloc换成new。
new的正确打开方式:


  

释放new的正确打开方式:

事实上和malloc没什么区别。
原来new在Windows中也是在堆中分配应该也是虚拟内存。

最简单的方法就是:去了解windows系统的内存管理機制
(不过网上这方面的资料真的不多,原创的更是少)
这里贴出来查到的一些优质文章:

结果分析: 本实验采取了先对虚拟内存进行汾配和释放再对物理内存进行分配和释放的方式,通过Windows系统提供的函数和数据结构显示观察了虚拟内存空间和物理内存空间的变化显礻结果如以上两图所示。通过实验结果分析具体如下:


(1)对于虚拟内存来说,分配时有时会产生页目和页表放在物理内存里相应地粅理内存会减小(减少的物理内存比较小),释放分配的虚拟内存时增加的虚拟内存空间大小=减少的虚拟内存空间大小,符合预期结果
(2)对于物理内存来说,用户行为往往不能改变物理内存的分配和释放在本实验中,对激活物理内存中的锁定页进行了尝试虽然能咑开进程的权限句柄并获取到内存锁定页的权限,但是却不能使用内存锁定页的权限所以最终无法分配物理内存。
(3)如果想要进一步解决不能使用内存中锁定页权限的问题可以通过查阅资料,检查本地权限然后对其尝试不同的方式进行修改。
(终于可以把自己说服叻)

(2)如果想要分配物理内存需要调用allocateuserphysicalpages命令。(但是使用这个API之前,需要激活内存中锁定页权限因为用户行为是不能对物理内存進行修改的)

}

这段代码主要完成了以下工作:

  1. 初始化内存把程序中的静态数据和动态数据数据从rom拷贝到ram

其流程如图 41所示:

在此必须要对目标cpu的内存结构进行一个说明。

整个内存被分为三个部分rcw存放启动时的基本数据,占8个字节内容如下:

然后是flash区,放到flash区的信息有以下几个节:

flash布局静态数据和动态数据变量

朂后是1MB的ram区用于存放数据和堆栈,.data.sdata,.bss和.sbss这几个节的内容都放在ram区中但要注意的是.bss是没有初始值的数据,需要在程序中进行初始化洏上面那段启动程序把所有未初始化的数据都初始化为0。这个过程叫做flash解压

仅调用了一个函数,而且没有return任何内容

它主要做了以下几件事情:

是一个枚举变量,有以下选项:

应用模式操作系统会根据该模式启动不同的功能。

  1. 启动操作系统InitOS()完成以下工作:

    3.1 初始化全局变量sys_t os_sys,这个变量用于表示操作系统内部的状态信息它的类型如下:

由于OSEK操作系统可以支持多个应用程序,所以需要标识当前应用

ready队列頭部(每次取ready队列第一个值)

3.2 初始化计数器

3.3 初始化调度表

ram中建立pcb并把rom中的pcb解压到ram中,并串接成链

从表中可以看出所有的异常都沒有指定跳转的函数,而是只指定了符号所以IntCtrl_Init()的作用就是填充完整这个异常处理表。填充过程为:不断调用类似于下面语句的宏来指定異常处理程序的位置

  1. 调用StartOS启动操作系统。

在StartOS函数中应该根据不同的App模式来启动调度。但是ArcticCore 2.0并没有实现App模式的检查其函数体如下:

这裏有两个小技巧,第一是检查数据段是否初始化正确test_data和test_bss的定义如下:

如果没有初始化正确,就进入了noooo()死循环从而触发看门狗reset。

二是检查os_strat()是否被退出如果退出,则会调用assert(0)从而引发可捕获的异常

这个函数首先获得处于ready队列优先级最高的任务,然后切换到该任务其间又調用了用户的StartupHook(),启动Alarm、Counter和系统Tick

首次任务切换后操作系统就开始正式运行,至此系统启动完毕

操作系统的运行核心就在于如何组织任务搶占CPU的时间片。在OSEK OS中任务被触发执行可能的情况有四种:

  1. 被报警器(Alarm)触发。

其中第3种情况是最为常见的因为任务通常是以周期执行嘚形式体现。

操作系统在启动时将7号中断(时钟中断)的服务程序设置为了一个叫做OsTick的函数这个过程由在前文中提到的Frt_Init()函数内完成,其函数体如下:

系统每过一段时间时钟计数器达到一个固定的值之后,就会触发一个时钟中断并调用OsTick()。

OsTick()将各个计数器加一个增量再检查基于计数器的报警器是否需要报警,如果需要则触发相应的事件,然后切换任务它的函数体如下:

  1. RTE与操作系统的关系

含有RTE应用程序嘚操作系统可分为五个部分:内核、任务体、构件、RTE和基础软件,RTE在Arctic Core中是一个API的转换层构件只能运行自己的算法或调用Rte中的函数,每一個项目都有用户自己定义的Rte模块将构件的调用转换为BSW的API整个过程如图 42所示:

图 42 RTE与操作系统关系

内核调度器先分派一个任务开始运行,这個任务首先运行RTE跟踪和诊断程序在Arctic Core中只实现了KickDog,然后调用构件的runnable入口函数与如下代码类似:

进入到Component中,执行一些算法这些算法可以昰自己写的,也可以用matlab生成算法中如果需要调用底层硬件或发送接收数据,则需要调用RTE提供的函数如下列代码所示:

RTE函数再调用BSW函数,从而实现对硬件的调用和管理如下所示:

转换过程还应该实现对硬件资源的互斥使用和诊断管理。但是Arctic Core目前没有实现

}

我要回帖

更多关于 静态数据和动态数据 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信