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

秦皇岛网站关键词万网域名注册查询

秦皇岛网站关键词,万网域名注册查询,邢台建设厅网站,信誉好的苏州网站建设参考 运行时访问__initial_sp和__heap_base 无RTOS时的情况 在以上配置的情况下#xff0c;生成工程。在工程的startup.s文件中#xff0c;由如下代码#xff1a; Stack_Size EQU 0x400AREA STACK, NOINIT, READWRITE, ALIGN3 __Stack_top ; 自己添加 Stack_Mem…参考 运行时访问__initial_sp和__heap_base 无RTOS时的情况 在以上配置的情况下生成工程。在工程的startup.s文件中由如下代码 Stack_Size EQU 0x400AREA STACK, NOINIT, READWRITE, ALIGN3 __Stack_top ; 自己添加 Stack_Mem SPACE Stack_Size __initial_spIF :DEF:__MICROLIB EXPORT __initial_spEXPORT __heap_baseEXPORT __heap_limitEXPORT __Stack_top ; 自己添加 ELSEIMPORT __use_two_region_memoryEXPORT __user_initial_stackheap __user_initial_stackheapLDR R0, Heap_MemLDR R1, (Stack_Mem Stack_Size)LDR R2, (Heap_Mem Heap_Size)LDR R3, Stack_MemBX LRALIGN ENDIF通过以上代码可以看出需要使能MicroLib才会默认导出__initial_sp,__Stack_top,__heap_base,__heap_limit这几个变量。如果不使能MicroLib则需要在上面代码的ELSE下面也添加EXPORT语句将这几个变量导出。 然后在main.c中添加如下代码查看以上这些变量的值 extern uint32_t __heap_base, __heap_limit;extern uint32_t __Stack_top, __initial_sp;extern uint32_t __Vectors, __Vectors_End, __Vectors_Size;while (1){// 0x200013A8 ~ 0x200015A8 size:0x200 RAMprintf(heapS[0x%08x], heapE[0x%08x]\r\n, (uint32_t)__heap_base, (uint32_t)__heap_limit);// 0x200019A8 ~ 0x200015A8 size:0x400 RAMprintf(stackS[0x%08x], stackE[0x%08x]\r\n, (uint32_t)__initial_sp, (uint32_t)__Stack_top); // 0x08000000 ~ 0x080000EC ROMprintf(VectS[0x%08x], VectE[0x%08x], VectSize[0x%x]\r\n\r\n, (uint32_t)__Vectors, (uint32_t)__Vectors_End, (uint32_t)__Vectors_Size);}从上可以看到__Stack_top和__heap_limit是一样的说明这里分配的堆和栈是紧邻的。而且地址刚好也和我们在cubeMx中定义的一致。堆和栈是在RAM中而中断向量表是在Flash中。 添加FreeRTOS 从以上三张图中可以发现我们给FreeRTOS总共分配了3072(0xC00) Bytes HEAP空间。而我们定义了一个defaultTask并分配了256 * 4 1024 Bytes但是在最后的FreeRTOS Heap Usage页面看到defaultTask实际使用了1144 Bytes剩余3072 - 1144 1928 Bytes。除了defaultTask多使用的1144 - 1024 120 Bytes用于任务控制块TCB外其余都是可以对上的。 生成工程后我们还是将之前的那些堆栈指针地址打印出来看一下MCU是如何进行地址分配的。只是这里还需要添加FreeRTOS中的堆栈信息了。首先通过追踪configTOTAL_HEAP_SIZE可以发现堆空间定义为了一个数组 static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];uint8_t* osHeapPoint ucHeap; // 由于以上变量是 static 类型所有这里再定义一个指针指向这个 Heap 地址以便在外部访问它然后我们就可以在defaultTask任务里面添加输出以上变量地址的代码了 extern uint32_t __heap_base, __heap_limit;extern uint32_t __Stack_top, __initial_sp;extern uint32_t __Vectors, __Vectors_End, __Vectors_Size;extern uint8_t* osHeapPoint;extern uint32_t local_addr1, local_addr2;void* os_mal_buf malloc(50);uint32_t tast_local_val 1;for(;;) {// 0x20002D10 ~ 0x20002F10 size:0x200 RAMprintf(HeapS[0x%08x], HeapE[0x%08x]\r\n, (uint32_t)__heap_base, (uint32_t)__heap_limit);// 0x20003310 ~ 0x20002F10 size:0x400 RAMprintf(StackS[0x%08x], StackE[0x%08x]\r\n, (uint32_t)__initial_sp, (uint32_t)__Stack_top); // // 0x08000000 ~ 0x080000EC ROMprintf(VectS[0x%08x], VectE[0x%08x], VectSize[0x%x]\r\n, (uint32_t)__Vectors, (uint32_t)__Vectors_End, (uint32_t)__Vectors_Size); // 中断向量表// 0x20002110 size: 3072 Bytes(0xC00)printf(OsHeapPoint[0x%08x]\r\n, (uint32_t)osHeapPoint); // freeRTOS中定义的HEAP数组// 0x20002D18printf(Os_mal_buf[0x%08x]\r\n, (uint32_t)os_mal_buf);// 0x20002504printf(Os_mal_buf[0x%08x]\r\n, (uint32_t)os_mal_buf);// 0x20002508printf((char*)buf, tast_local_val[0x%08x]\r\n\r\n, (uint32_t)tast_local_val); // 在freeRTOS任务中定义的局部变量// 0x20000008, 0x2000000Cprintf(global_var1[0x%08x], global_var2[0x%08x]\r\n, (uint32_t)global_var1, (uint32_t)global_var2); // 函数外部定义的全局变量// 0x20003304, 0x20003308printf(local_addr1[0x%08x], local_addr2[0x%08x]\r\n\r\n, local_addr1, local_addr2); // 这两个全局变量保存了在freeRTOS初始化前在main()函数中定义的两个局部变量的地址}根据以上输出总结如下 从local_addr的地址(靠近__initial_sp)可以看出栈空间的地址值是向下增长的即栈顶(__initial_sp 0x20003310)在高地址从全局变量的地址可以看出全局变量是默认分配在RAM的起始地址在freeRTOS任务中定义的局部变量(tast_local_val 0x20002508)存储在定义freeRTOS时定义的HEAP里(0x20002110~0x20002D10)再看一下tast_local_val 0x20002508这个数据发现0x20002508大概等于0x20002110 256*4 0x20002510。这就再次说明freeRTOS定义任务时是从配置好的HEAP地址初始空间的开始部分给新任务分配Task stack的而在任务中使用这个task stack时还是符合栈的使用规范即从高地址开始分配从s_mal_buf 0x20002D18可以知道即使在freeRTOS任务中动态分配也是在任务之外的堆中分配空间。 疑问 通过以上总结发现在freeRTOS任务中定义局部变量和在freeRTOS任务之外定义局部变量他们分配的地址空间是不一样的。那么如果有以下函数 void addr_test(void) {uint32_t loc_var 1;printf(loc_var 0x%08x\r\n, (uint32_t)loc_var); }我分别在freeRTOS初始化之前调用以及在freeRTOS的任务中调用其输出会是什么呢 经过验证在freeRTOS初始化之前调用输出的地址范围在0x20002F10 - 0x20003310之间而在freeRTOS的任务中调用输出的地址范围在0x20002110 - 0x20002D10之间。
http://wiki.neutronadmin.com/news/249811/

相关文章:

  • 建大型网站无锡网站备案
  • 网站建设有哪三部建行个人手机银行
  • 网站推广六种方法建设企业网站得花多少
  • 无锡公司网站建设服务哈尔滨网站搭建的价格
  • 上海建站网设计网站推荐p
  • 网站后天添加文章不显示智能网站建设系统
  • vs2019可以做网站吗2019做网站
  • 音乐制作软件seo搜索引擎
  • 有口碑的盐城网站开发wordpress 客户端源码
  • c 网站开发需要学什么软件怎样做网站的用户分析
  • 网页模板下载网站知乎淄博网站制作企业高端
  • 怎么查网站是不是正规建设一个网站的规划
  • 泰安网站建设哪家强商业计划书ppt模板免费下载
  • 上海php网站开发无锡本地网站
  • 做电商要不要公司网站网站建设服务
  • 崇信县网站留言曹县建设局网站
  • 企业站官方网站辅助wordpress 页面编辑器
  • 旅行网站设计百度资源共享
  • 做淘宝保健品药品在哪个网站找素材广州市做app的公司地址
  • 曙光建设有限公司网站wordpress 分类目录下不显示文章
  • 制作网站软件手机中山小型网站建设公司
  • 如何申请网站建设网站目的及功能定位
  • 彩票网站建设一条龙国内简洁大气网站推荐
  • 南宁网站建设企业网站南京江宁 网站建设
  • 最近高清中文在线国语字幕seo优化培训学校
  • 网站上传 404网络教学网站建设
  • 网站回头率网站优化一年多少钱
  • 军队房地产与建设工程法律实务在哪个网站可以购买wordpress怎么改字体
  • 成都高端网站建设公司哪家好为什要做网站
  • 网站建设价格明细攻城霸业手游下载