您好、欢迎来到现金彩票网!
当前位置:老k棋牌 > 栈指针 >

如何使堆栈指针指向任意处

发布时间:2019-06-27 05:55 来源:未知 编辑:admin

  最近在学习ucos,希望能够移植到单片机上玩玩,但是遇到一个问题。我用的开发板是瑞萨的R8系列,这个单片机有系统堆栈,比如我设置堆栈大小1K,则堆栈指向0x1bc0-0x17c0,SP=0x1bc0;uc...

  最近在学习ucos,希望能够移植到单片机上玩玩,但是遇到一个问题。我用的开发板是瑞萨的R8系列,这个单片机有系统堆栈,比如我设置堆栈大小1K,则堆栈指向 0x1bc0 -0x17c0, SP=0x1bc0; ucos 是多任务OS,它又会为每一个任务模拟一个任务堆栈,比如是在 0x2000 -0x20ff ,当作任务切换的时候,需要把SP指向任务堆栈 0x2000,。但是这时候IAR就会报错,说堆栈溢出了。请问这个该如何处理,谢谢!

  可选中1个或多个下面的关键词,搜索相关资料。也可直接点“搜索资料”搜索整个问题。

  展开全部堆栈设置的太小了,你的堆栈设置应该包括任务堆栈,系统堆栈,因为编译器是死心眼,在他眼里你就是1万个任务也是单任务,因为他根本不知道你装了系统,堆栈只能设置一个,多任务是在栈内部再细分。。。。。。栈外的内存,编译器编译时会另有用途,你如果不事先预定,他还以为你不打算用。。。。更多追问追答追问系统堆栈建立是在MCU初始化阶段,那个时候还没有建立任务。当建立任务,初始化任务堆栈的时候如何把任务堆栈指定到系统堆栈呢?追答这需要你在UCOS里设置任务堆栈大小(虽然UCOS支持自定义堆栈,但这个功能可以不移植),如果非自定义堆栈,用UCOS的非加强版创建堆栈,第一个设置了,每次创建任务堆栈分配,你需要定义栈顶,只要栈顶没有出系统堆栈就行了。。。。追问在移植的时候,我是在开始就为每个任务分配了任务堆栈,但是在任务切换的时候把 最高优先级任务的指针传递给SP,老是说溢出,因为任务指针 地址是 0x2000,超出了系统堆栈0x1bc0 -0x17c0,的范围,能教下我,要怎么样才能使任务堆栈是分配在系统堆栈包含的范围内吗?

  急切 + 恳切 的等待您的再一次回复!追答我不知道你是怎么设置堆栈的,是写汇编代码写的,还是用软件选项卡设置,如果是后者你的软件可能过于智能化了,我用的KEIL arm,就不会有堆栈溢出这种检测,只是某些不可写的存储空间进行写操作会报错,完全是当裸机处理的。。。堆栈只要是RAM里,随便分配的,在汇编内声明内存块占用就行。。。实际情况下,没有内存管理器的CPU根本不具备堆栈溢出检测的能力,你的应该是软件提个醒,未必不能运行。。。

  ostaskcreate就有一个参数是 ptos,这个参数就是栈顶的位置,只要你ptos的值在0x1bc0 -0x17c0之间就行,这样根据CPU的增长方向,ptos+size或者ptos-size的范围就是任务堆栈,不要出总体栈的范围就行。。。。对于UCOS-ii这种小系统,想不溢出,你就大致感觉下需要的栈大小,设置ptos的值就行了,没有限定堆栈大小。。。。

http://advntravel.com/zhanzhizhen/91.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有