当前位置: 首页 > news >正文

武威市网站建设_网站建设公司_图标设计_seo优化

国外做美食视频网站有哪些,扫描二维码进入公司网站怎样做,贵州建筑网站,广州智迅网络做网站在嵌入式软件开发中#xff0c;我们经常会提到堆和栈#xff0c;实际上堆和栈都是RAM上的物理内存空间#xff0c;只是使用方式不同而已。栈和堆都是单片机RAM中一段连续的存储空间#xff0c;该段空间一般在启动文件或链接脚本中指定#xff0c;最后在C库的_main函数中进…在嵌入式软件开发中我们经常会提到堆和栈实际上堆和栈都是RAM上的物理内存空间只是使用方式不同而已。栈和堆都是单片机RAM中一段连续的存储空间该段空间一般在启动文件或链接脚本中指定最后在C库的_main函数中进行初始化。 STM32中的堆栈内存空间分配就在启动文件中完成: 栈STACK由编译器自动分配和释放 堆HEAP有的地方也叫堆栈一般由用户自行分配和释放因此在分配好使用完成后要及时释放内存否则会导致系统可用的内存越来越少我们管这种情况叫做内存泄漏 使用MDK5进行STM32项目开发时当点击全部编译后会在Build Output窗口生成如下信息 那么这些信息究竟是代表什么意思 Code代码段存放程序的代码部分RO-Data只读数据段存放程序中定义的常量RW-Data读写数据段存放初始化为非0值得全局变量ZI-Data0数据段存放初始化为0的全局变量或未初始化的全局变量程序运行时会对未初始化的全局变量自动清0 需要注意的是启动文件中定义的STACK和HEAP内存空间都是被包含到ZI-Data中的如下图片可对比说明 当STACK空间大小设置为0x400时ZI-Data空间大小为2908Byte设置为0x200时ZI-Data空间大小为2396Byte。2908-2396 512 0x200因此可以说明栈空间是被包含在ZI-Data中的。将HEAP空间大小由0x200设置为0x100时ZI-Data空间大小由2396变为2140,2396 - 2140 256因此可以证明堆空间是被包含在ZI-Data中的。 在工程编译完成后也会生成的对应.map文件.map文件中详细描述了各个函数在ROM中的存储地址和大小也可以看到程序中定义的全局变量、全局数组、常亮等在RAM中的存储地址和大小因此.map文件是非常重要的一个文件。在生成的.map的最后几行也可以看到如下信息 那么这些信息究竟是代表什么意思 RO Size程序在ROM中的存储大小包括Code段和RO-Data段RW Size程序运行时占用RAM空间的大小包括RW-Data段和ZI-Data段ROM Size程序烧写到ROM上时占用的空间大小包括Code段和RO-Data段、RW-Data段这里不包含ZI-Data段是因为ZI-Data段全部是0将其存储在ROM中毫无意义因此只需记录ZI-Data段占用的内存空间在程序运行时在RAM上开辟对应大小的内存空间并将该区域清0即可 const int ci_max_len 100; //RO段 static int si_loop_time 300; //RW char *p1; //ZIint main(void) {int i 0; //STACKchar c_say_a[] hello world; //c_say_a存储于STACKhello world存储于ROchar *p s[0]; //STACKstatic int si_i 5; //RWchar *p2; //STACKp1 (char *)malloc(100); //HEAPp2 (int *)malloc(100); //HEAP...free(p1);free(p2);return 0; } Cortex-M3和Cortex-M4在设计之初就考虑到了对OS的高效支持主要有3点 它们都具有一个内置的的简单的向下计数24位计数器SysTick。之所以要在处理器内增加一个定时器主要是为了提高软件移植的方便性。所有基于Cortex-M3和Cortex-M4内核的处理器具有相同的SysTick定时器在一种Cortex-M3/M4处理器上实现的OS也能适用于其它Cortex-M3/M4处理器。因此嵌入式OS的源码可以很容易的移植到其它Cortex-M3/M4内核的处理器上无需为设备相关的定时器做修改。Cortex-M3内核支持双堆栈机制即主堆栈MSP和线程堆栈PSP。OS内核和系统中的中断或异常使用MSP用户创建的多线程任务使用PSP。Cortex-M3/M4内核支持特权模式和非特权模式可以将用户创建的多线程任务在非特权操作模式中运行这样可以限制其对一些寄存器的访问如NVIC、CONTROL寄存器等以免因为不可靠的程序引起整个系统的崩溃。 在裸机系统中所有的变量、函数调用、中断处理等使用的栈空间均是MSP。在使用RTOS的多线程系统中每个线程都是完全独立互不干扰的因此需要为每个线程分配独立的栈空间这个栈空间可以是预先分配好的全局数组即存储于RW-Data段或ZI-Data段也可以是动态分配的一段内存空间注意这里动态分配的空间不是启动文件中定义的堆空间而是由RTOS管理的内存空间但本质上它们都是RAM上的一段内存空间。 在RT-Thread中若需要动态内存管理则需要先调用board.c---rt_hw_board_init()---rt_system_heap_init((void *)HEAP_BEGIN, (void *)HEAP_END);函数进行动态内存管理范围的配置即将HEAP_BEGIN和HEAP_END之间的内存空间作为动态内存空间交由RT-Thread进行管理。 在RT-Thread Master和RT-Thread Nano版本中对于rt_system_heap_init()函数调用时填入的参数有些许差异下面进行对比说明。 RT-Thread Master版本 RT-Thread Master版本默认开启RT-Thread中的动态内存分配并将将HEAP_BEGIN和HEAP_END之间的内存空间作为动态内存空间交由RT-Thread进行管理。其中在board.h文件中有定义具体如下 Image$$RW_IRAM1$$ZI$$Limit是一个链接器导出的符号代表ZI-Data段的结束也即程序执行时所占RAM空间的结束地址也是未使用RAM 空间的起始地址。因此RT-Thread Master版本中会默认将RAM中剩余的内存空间全部交给RT-Thread进行动态内存管理。 RT-Thread Nano版本 RT-Thread Nano版本默认不开启RT-Thread中的动态内存分配因此凡是涉及到使用RT-Thread动态内存分配的函数都不能使用如在创建线程时无法使用rt_thread_create()函数只能使用rt_thread_init()函数等。用户需开启rtconfig.h中的RT_USING_HEAP宏开启使用RT-Thread进行动态内存分配的功能因为动态内存分配中有使用到信号量因此还需打开RT_USING_SEMAPHORE宏。rt_system_heap_init()函数中使用的参数rt_heap_begin_get(), rt_heap_end_get()均在board.c文件中有定义具体如下 可以看到RT-Thread Nano版本中是将用户定义好的大小为1024 * 4个字节的内存空间交由RT-Thread进行动态内存管理而非将RAM中剩余的内存空间全部交给RT-Thread进行动态内存管理。 这里需要明白的是程序中并不是将RAM空间用完的假使RAM为20KByte实际上只使用了8560Bytes则剩余的RAM空间全部闲置在那儿。因此在RT-Thread Nano版本中使用数组作为动态内存堆时可能会有一部分RAM空间是闲置的。 当把RT_HEAP_SIZE由1024 * 4Byte改为256 * 4Byte时生成的工程信息中只有ZI-Data发生变化。由11124变为8052即11124 - 8052 3072Byte和程序中的变化值相等。因此我们可以理解为RT-Thread Nano是通过定义全局数组的方式在ZI-Data段占据了一段空间并将这段空间交由RT-Thread进行动态内存分配。 如果不想使用RT-Thread-Nano中使用数组作为动态内存堆的方式也可以使用和RT-Thread-Master中同样的方法将ZI段结束作为动态内存堆起始地址将RAM空间结束地址作为动态内存堆的结束地址。这样可以将程序运行所需RAM空间之余的全部空间作为动态内存堆使用即RAM上没有闲置的内存空间。 将board.c中的代码作如下修改 其中#ifndef USE_ARRAY_AS_RTT_HEAP和#else之间的为新增加的代码当定义USE_ARRAY_AS_RTT_HEAP宏时使用用户自定义数组作为动态内存堆否则则使用ZI段结束到RAM空间结束之间的内存作为动态内存堆。 //#define USE_ARRAY_AS_RTT_HEAP //定义该宏后使用用户自定义的数组作为RT-Thread的动态内存堆#ifndef USE_ARRAY_AS_RTT_HEAP#define STM32_SRAM1_START (0x20000000) #define STM32_SRAM1_END (STM32_SRAM1_START 20 * 1024) // 结束地址 0x20000000基址 20K(RAM大小)#if defined(__CC_ARM) || defined(__CLANG_ARM)extern int Image$$RW_IRAM1$$ZI$$Limit; // RW_IRAM1需与链接脚本中运行时域名相对应#define HEAP_BEGIN ((void *)Image$$RW_IRAM1$$ZI$$Limit)#endif#define HEAP_END STM32_SRAM1_END #else#if defined(RT_USING_USER_MAIN) defined(RT_USING_HEAP)#define RT_HEAP_SIZE 1024static uint32_t rt_heap[RT_HEAP_SIZE]; // heap default size: 4K(1024 * 4)RT_WEAK void *rt_heap_begin_get(void){return rt_heap;}RT_WEAK void *rt_heap_end_get(void){return rt_heap RT_HEAP_SIZE;}#endif #endif/*** This function will initial your board.*/ void rt_hw_board_init() {/* this function is defined in main.c, so use extern indicate this is an external function */extern void SystemClock_Config(void); HAL_Init();SystemClock_Config(); /* System Clock Update */SystemCoreClockUpdate();/* System Tick Configuration */_SysTick_Config(SystemCoreClock / RT_TICK_PER_SECOND);/* Call components board initial (use INIT_BOARD_EXPORT()) */ #ifdef RT_USING_COMPONENTS_INITrt_components_board_init(); #endif #define RT_USING_USER_MAIN #define RT_USING_HEAP #if defined(RT_USING_USER_MAIN) defined(RT_USING_HEAP)#ifndef USE_ARRAY_AS_RTT_HEAPrt_system_heap_init((void *)HEAP_BEGIN, (void *)HEAP_END);#elsert_system_heap_init(rt_heap_begin_get(), rt_heap_end_get());#endif #endif } 编译后生成的.map文件如下所示可以看到用户自定义的数组消失了程序使用栈顶地址0x20002b90和RAM空间结束地址0x20005000之间的RAM空间作为RT-Thread的动态内存堆。 当然RT-Thread Master中也可以使用RT-Thread Nano中默认的使用用户自定义的数组作为动态内存堆的方式。具体如何使用RAM空间是很灵活的可以由用户自行指定的。当你深入了解RAM空间的分配原理后一定要研究.map文件开发中很有用的一个文件就会发现用户就像是单片机的上帝上帝可以任意支配手中的资源。而如何让单片机中这些资源按照用户的意愿去分配、去实现既定的功能是我们用户需要去好好研究的。
http://www.lebaoying.cn/news/83274.html

相关文章:

  • 车子网站外贸网站建设 东莞
  • 广州最新发布消息排名优化公司口碑哪家好
  • 淮北建网站费用南宁网站建设业务员
  • 网站优惠券怎么做的注册公司流程2021
  • 网站做支付需要准备什么深圳建设网站上市
  • 西宁市建设局官方网站项目推广方式有哪些
  • 龙岗区网站建设公司邵阳微网站开发lz2v
  • 国内 设计网站的公司东莞网站制作搭建
  • 网站建设设计原则绩溪网站建设
  • 网站可以不进行icp备案吗微信运营是做什么的
  • windows搭建php网站软件开发者平台有哪些
  • 自己做的网站本地调试怎样免费建立个人网站
  • 南昌专业做网站公司有哪些代刷网站是怎么做的
  • 做美食分享网站源码六安同城网
  • 目前比较流行的公司网站建站技术深圳注册公司地址新规定
  • 推广网站怎样做做网站必备语言
  • 福建省建设职业管理中心网站茶叶网站模板下载
  • 国外设计文章的网站中山网站建设文化机构
  • 邢台建设厅网站wordpress注册弹窗代码
  • 利用微博做网站推广网站需要具备条件
  • 网站建设 移动端界面设计师培训
  • 做汽配的都上什么网站湖北省住房和建设厅官方网站
  • php做的大型网站有哪些专业网站建设行业现状
  • 对网站主要功能界面进行赏析重庆五号线金建站
  • 原墨网站建设北京培训学校
  • 天津网站优化排名推广免费凡客建站官网
  • 菏泽网站建设效果宝安网站设计哪家好
  • 网站快速收录技术河南百度推广代理商
  • 在线做logo印章网站池州哪家做网站
  • 许昌网站建设公司排行榜网建平台