首先,我们来理解一下两个概念:
1、堆栈就是一段连续的空间。用于存储数据的,在c计算机中有很多应用,比如发生中断时保存现场,c语言函数调用时保存现场和临时变量。
2、堆栈指针就是一个数据指针。有时候计算机自己更改其指针指向的位置来保存数据,如中断时,有时候我们程序员更改其值,比如ucos操作系统做任务切换时。
堆栈作用的就是用来保存局部变量,从实质上讲也就是将CPU寄存器的值保存到RAM中。在uCOS中,每一个任务都有一个独立的任务堆栈。为了深入理解任务堆栈的作用,不妨分析任务从“出生”到“消亡”的整个过程,具体就是分析任务的建立,运行,挂起几种状态中任务堆栈的变化情况。
目前假设系统运行着一个由用户创建的用以完成打印工作的任务TPrint。TPrint最初通过OSTaskCreate()函数创建,在该函数中与任务堆栈有关的第一段代码是大家比较熟悉的函数OSTaskStkInit(),这个函数是在uCOS移植过程中必须实现的,其作用是“初始化堆栈”,其实就是预先在RAM中的一块区域中把任务将来运行开始时CPU寄存器应处的状态(正确值)准备好,之后,任务第一次被内核调度器调度运行时,将这些准备好的数据(寄存器的值)推到CPU的寄存器中,如果数据设计的合理,CPU便会按照我们预先设计好的思路运行。
所以,“初始化堆栈”实际上是做了一个“未雨绸缪”的工作。这个过程中有两点是必须慎重考虑的,一是PC该如何定位,二是CPU的其它寄存器(除PC之外)该怎么处理。先说第一点,因为任务是第一次运行,而任务从实质上将就是一段代码,所以PC指针应该定位到这段代码的第一行处,即所谓的入口地址(Entry Point)处,这个地址由任务指针保存着,所以把该指针值赋给PC即可。第二,这段代码还未被履行过,所以代码中的变量与CPU的其它寄存器一点关系也没有,因此R0-R12,R14可随便给值,或者不赋值也可,让这些寄存器保持原来的值,显然后者更为简单。最后再给CPSR赋值,用户可以根据实际需要使系统运行于系统模式或管理模式。经过入栈和出栈,此时SP指向任务堆栈的最底端(就是已经定义好的任务堆栈数组的最后一个元素)。
之后任务代码开始正式运行,因为CPU的寄存器是有限的,所以在运行时不可避免地要把一些临时变量暂时保存到堆栈中。具体应保存到哪个地址呢,不用担心,SP知道(任务第一次运行时,这个地址就是任务堆栈数组的最后一个元素的地址)。任务堆栈的大小和任务代码中临时变量的数目有关,如果这段代码临变量分外多,堆栈就应设计的大一些。
然后,TPrint任务由于某种理由将要被挂起,所以应把任务的运行现场放到堆栈里保护起来,TPrint任务再次运行时再把这个现场还原,任务就能从上次断点处紧接着运行。
那么,这个现场是什么呢?从本质上讲,TPrint任务的运行过程就是CPU在履行一段特定的代码,所以这个现场就是CPU的现场,也就是寄存器的值。这些寄存器的值包含了代码履行时的所有消息,包括当前运行到了这段代码的哪个位置处(由PC值指明)。因此,把CPU的寄存器的值推入堆栈,然后记住栈顶指针的位置(SP由OSTCBCur->OSTCBStkPtr保存),当任务再次将要运行前,从SP指向的地址处依次把先前保存的CPU寄存器的值放到CPU的寄存器中,任务就可以从上次中断的地方准确无误地履行。这个过程就像突然把任务冻结了,与任务有关的任何东西都不能动了,一段时间之后又把任务解冻,与它有关的东西又变得可用,于是任务又可以活蹦乱跳地跑起来了。
从以上分析可以看出,任务堆栈至始至终伴随着任务,与之生死与共,它的作用可以概括为两点:
第一,当任务运行时,它用来保存一些局部变量;
第二,当任务挂起时,它负责保存任务的运行现场,也就是CPU寄存器的值。
有些良友正是忽视了第一点,产生了“任务堆栈大小应是固定值的疑问”。感觉,这也许与对函数OSTaskStkInit()的理解有关,我们都称之为堆栈初始化函数,但此处的“初始化”与我们理解的初始化不太一样,平时讲的(变量的)初始化似乎指的是将变量的所有成员都一一初始化。而此处的堆栈的初始化仅仅是初始化了很大一个堆栈的一小部分,因为当前只有这部分是有用的,而剩余的大部分用不到,所以不用初始化,就像有些变量不用初始化一样(有默认值或随机值)。更深入一点考虑,当任务挂起时,任务堆栈中保存任务挂起前CPU寄存器的这一连续的区域确定在整个堆栈的最上面;当任务重新开始运行时,SP弹出寄存器的值,这段区域变成空白的区域。而且,任务每次挂起前用来保存当前CPU寄存器这一连续区域在整个任务堆栈空间中是浮动的。
关键字:ucos CPU RAM
引用地址:
高手带你深入理解ucos任务堆栈
推荐阅读最新更新时间:2024-05-03 02:49
谷歌定制机器学习芯片强悍:比GPU加CPU至少快15倍
eeworld网北京时间4月6日消息,谷歌开发定制芯片,它可以提高机器学习算法的运算速度,这不是什么秘密。谷歌管这些处理器叫作Tensor Processing Units(简称TPU),2016年5月,谷歌在I/O开发者大会上首次展示了TPU,之后再也没有提供更多细节,谷歌只是说它正在用TPU优化TensorFlow机器学习框架。今天,谷歌公布了更多内容。 根据谷歌自己制定的基准,TPU执行谷歌常规机器学习任务时,速度比标准GPU/CPU组合产品平均快了15倍至30倍。标准GPU/CPU组合产品将英特尔Haswell处理器与Nvidia K80 GPU安装在一起。数据中心极为重视能耗,使用TPU后每瓦特性能(也就是T
[半导体设计/制造]
智能驾驶芯片TOP20排名
智能驾驶芯片排名并不简单只看AI算力,CPU、存储带宽、功耗和AI算力数值一样重要,这个下文会详细分析。CPU算力也很重要,智能驾驶系统软件异常复杂,会消耗大量的CPU运算资源,软件系统包含众多中间件诸如SOME/IP、自适应AUTOSAR、DDS、ROS等,基础软件包括订制的Linux BSP、OS抽象层、虚拟机,还有与底层硬件关联的内存管理、各种驱动、各种通讯协议等等。除此之外,应用层中的路径规划、高精度地图、行为决策等也大量消耗CPU资源,同时CPU也管理AI运算时的任务调度、存储搬运指令等,整体的任务调度、决策自然也是CPU的任务。CPU是绝对的核心,AI是CPU的附属功能,只是在做图像特征提取、分类、BEV变换、矢量地图
[嵌入式]
华邦推出为边缘AI带来超高带宽内存的CUBE架构
全球存储解决方案领导华邦今日宣布推出一项强大的内存赋能技术,可助力客户在主流应用场景中实现经济实惠的边缘 计算。华邦的 CUBE (半定制化超高带宽元件) 可大幅优化内存技术,可实现在混合云与边缘云应用中运行生成式 AI 的性能。
CUBE 增强了前端 3D 结构的性能,例如 chip-on-wr(CoW)和wafer-on-wafer(WoW),以及后端 2.5D/3D chip-on-Si-interposer 的基板和扇出(Fan out)解决方案。CUBE 专为满足边缘 AI 运算装置不断增长的需求而设计,能利用 3D 堆栈技术并结合异质键合技术而提供高带宽低功耗的单颗 256Mb 至 8Gb 内存。除此之外,
[机器人]
AMD预计并购ATI将在09年初见成效
北京时间2月13日消息,AMD旗下消费电子集团经理保罗·达尔·尚托(Paul Dal Santo)周一表示,AMD预计其耗资54亿美元收购图形芯片厂商ATI将在2009年初见成效。 此前曾担任ATI经理的尚托表示,合并后的企业今年将可以解决如何将图形和计算机处理技术结合起来的难题,他预计大约需要两年的时间面向市场推出产品,但拒绝透露新产品的细节。不过他表示,新产品将把图形和AMD最擅长的CPU结合起来。
[焦点新闻]
内存行情下行到极限 减产已成最后毒药
国际NAND Flash大厂面对严重亏损,近期纷展开释放压力动作,避免压力锅爆炸,包括三星电子、海力士、美光纷祭出对策挽救市场,其中,三星再度受惠苹果(Apple)为新产品备货,增加NAND Flash采购,使得10月合约价止跌上扬,且近期传出三星会让生产NAND Flash、成本不佳的8吋晶圆厂逐渐退役;海力士在减产后,目前NAND Flash产能比重降至20~30%,10月起明显减少现货市场供货;至于美光亦宣布减产,并全球裁员15%,凸显3大NAND Flash厂面对亏损的忍受度已达到极限。 2008年DRAM和NAND Flash都面临严重跌价压力,其中,NAND Flash压力更甚于DRAM,主要是因为目前多数D
[焦点新闻]
使用用CPLD和Flash实现FPGA的配置
电子设计自动化EDA(Electronic Design Automation)是指以计算机为工作平台,以EDA软件为开发环境,以硬件描述语言为设计语言,以可编程逻辑器件PLD为实验载体(包括CPLD、FPGA、EPLD等),以集成电路芯片为目标器件的电子产品自动化设计过程。该过程目前已广泛应用于电子电路与系统的设计和产品的开发中.逐渐取代了传统的手工硬件电路设计方式。设计的系统具有体积小、重量轻、功耗小、速度快、价格低、可靠性高、设计周期短等优点。一个功能完备的EDA设计软件加上一片普通功能的可编程逻辑芯片就可以构成以前需几百个集成电路才能构成的电子系统。 目前常用的可编程逻辑器件有CPLD(Complex Progr
[嵌入式]
英特尔以CPU作为控制中心,发布HERO机器人平台计划
据报道,推出HERO智能机器人平台合作伙伴计划,此方案以作为控制中心,搭配和VPU,可以实时处理大量数据并运行多种智能算法。 “英特尔中国研究院开放日”近日在北京举行,英特尔中国研究院院长宋继强及其团队共同分享了研究院目前的研究方向,展示了人工智能、机器人、、虚拟现实等领域的研究成果。同时宣布围绕HERO平台推出全新的合作伙伴计划。
HERO智能机器人开放平台(Herogeneous Extensible Robot Open Platform)是英特尔中国研究院专为智能机器人(包括服务机器人、医疗机器人、汽车等)建造的一套低功耗、高性能、体积小的异构系统平台方案。 在此方案中,CPU作为控制中心
[机器人]
联名紫禁城IP realme真我V25发布:超大内存 价格1999元
北京时间2022年3月3日,realme正式召开“手握星河”主题发布会,推出了新一代国潮手机realme真我V25。本次真我V25携手“紫禁城”国潮IP,将科技与东方文化的传承相结合,真我V25标配旗舰级“12 GB+256GB”超大内存组合,而此次发布会上,全新真我Buds Q2s无线耳机也同步亮相。 外观方面,本次realme联名“紫禁城”IP,从紫禁城与星河中汲取灵感,让真我V25实现了从设计语言到工艺的全面突破。 配色方面,真我V25采用了“紫微星”配色,还原紫禁城夜晚的星辰变幻,使用复合工艺打造“星空纹理设计”——双纹双镀工艺将光线汇集在后盖中心,并漾印星河,极具辨识度。而且realme在价位段首次应用光致
[手机便携]