发 帖  
原厂入驻New
申请华秋企业认证 多层板首单免费打样!
30s提交资料,10分钟通过审核(免费赔付+顺丰包邮)>>立即报名
[问答] PIC1XF1XXX增强型中档器件的上下文保存
122 pic12 CCS 寄存器
分享
我正在使用PIC12F1840增强的中档设备。我正在为这些设备编写一个多任务操作系统PIC1XF1XXX。当事件发生时,我需要保存状态。我正在保存W、状态、BSR、ITCN、PCLAST、FSR0L、FSR0H、FSH1L、FSR1H。(我需要保存更多吗?)我需要一个地方来放置这9, 8位寄存器。当事件发生时,我不知道我在哪一个银行,我需要保存寄存器而不干扰它们的内容。所以我把它们保存在每个银行的临时空间。我正在使用CCS C。我不确定这些位置不会被CCS C或microchip C所困扰(我该怎么办?)我很希望能够将它们保存在C(即核心)可以访问的9个变量中,但不知道我所处的银行是复杂的事物。我如何解决能够存储寄存器而不打扰他们的问题,不管我在哪家银行?
0
2019-10-8 07:26:17   评论 分享淘帖 邀请回答

相关问题

16个回答
是什么触发了你的“事件”?如果它们是中断,那么PIC已经为您保存了大部分寄存器,您可以从上一个存储库中的阴影抓取位置检索它们。如果由于某种原因而不可行,则必须为操作系统保留一个全局寄存器。
2019-10-8 07:44:59 评论

举报

你说的“事件”是什么意思?如果是中断,那么硬件会自动将这些信息保存在银行31(INTCON除外)。如果不是中断,您只需要一个地方来保存BSR。然后你可以切换你的银行并保存剩下的。你可能需要保留一个公共空间(0x70~0x7f)。没有其他选择,因为你将无法恢复BSR不知道它在哪个银行。
2019-10-8 07:53:03 评论

举报

打扰自己照顾自己。事件是操作系统宏调用,如.()或.()或在其中一个事件之后准备执行新任务。当产生或延迟宏激活时,所有寄存器(9)都需要保存,而不改变它们的上下文。每个银行的末端都有公共RAM。这就是我试图在不改变银行的情况下使用的方法。除非我能保存一个寄存器(BSR)?或FSR,然后保存到我自己的变量,我可以从我的C程序访问。
2019-10-8 08:06:18 评论

举报

请看RIC的回复。我有点得出这个结论(保存BSR),但我不知道什么bank将被用于我的C程序变量——我想我需要测试当我在C中保存一个变量时发生了什么,看看在执行赋值时使用哪些寄存器。除非我可以强迫CCS C使用银行1把我的临时保存区放在寄存器中。一旦我的寄存器被保存,我就可以把它们移到我的任务控制块保存区域。
2019-10-8 08:25:56 评论

举报

我不熟悉CCS C。在XC8中,预订绝对地址很容易,所以您可以在公共银行0x70到0x7F中预订一个。只要预订一个以节省BSR,那些公共寄存器是很早的资源!
2019-10-8 08:35:01 评论

举报

注意,FSR是一个双字节实体,但BSR是一个字节(5位Irc)。这个家族中的公共内存是16字节(十进制),所以请确保您以记忆的方式使用公共内存的每个字节。---OS是否支持抢占?如果是这样,那就是“非计划”的收益率。这意味着需要对外围设备进行保护。你不能仅仅是一个写PPS寄存器的任务,而对另一个任务进行控制。需要适当的保护。--如果能在C语言中完成这一切,您应该报告。大多数多任务系统都有重要的汇编程序支持。GP
2019-10-8 08:50:44 评论

举报

OS是协作的,所以在任何I/O已经被预处理之后,所有OS调用都是由用户计划的。CCS C实际上没有链接器,汇编程序包含在由A/ASM/EnthASM包围的C程序中。我正在为MPLAB设计一个版本,我将有一个汇编器和链接器。
2019-10-8 08:59:15 评论

举报

CCS C假设当前银行是否存在ASM块?我确信XC8将假定银行寄存器已经被任何内联asm块更改,并在下一次内存访问时手动设置它,因此不需要保存它。
2019-10-8 09:17:24 评论

举报

如果您的事件是C函数,那么您可以使用正则变量。这意味着你可以把BSR指向想要的银行。一旦你有了它,你只需保存。使用0x70- 0x7f是个坏主意,因为它只有16字节,它们确实需要其他地方。在最坏的情况下,您只能使用其中之一。<edit>BTW:如果您完全用C编写,那么您不应该担心协作系统中的上下文节省。
2019-10-8 09:33:58 评论

举报

我会问CCS,看看他们是否保存BSR之前的汇编块。谢谢大家对这个问题的投入。
2019-10-8 09:53:07 评论

举报

不太可能。由于BSR是不断变化的,它们的代码通常只是稍后再设置一次。在XC8中,它将bank select代码放在每次访问内存之前,然后优化器遍历并删除明显冗余的代码。
2019-10-8 10:01:26 评论

举报

查看CCS生成的代码,当从Y.EnEASM返回C代码时,不会发生BSR的修改。我认为需要保存在全局寄存器中的寄存器是W(它是主传输寄存器)、STATUS、BSR——然后其余的寄存器可以保存在非全局ram中。之后,我换回到C,把所有的CPU寄存器(ITCCON)复制到TaskCuffic块结构中。你怎么认为?谢谢。阿尔文…
2019-10-8 10:10:44 评论

举报

你是说,下一个内存访问假定同一个BSR被选择,因为它是在ASM块之前?
2019-10-8 10:21:38 评论

举报

阿尔文:我想知道你是否愿意分享为这些MCU建立一个正式的多任务系统的动机?从杂草中爬出来(TCBS里有什么?)有没有堆叠开关?是否需要保存状态?ITCCON是TCBS的一部分吗?还有一个更大的问题:对于一系列RAM只有128字节的MCU来说,正式任务是否是多任务处理的正确解决方案?在小型MCU上多任务处理的一个常见解决方案是反转问题——执行任务,并在准备好时可以调用的步骤(由I/O完成等待或仅执行时间量限定)中分解它们。除了私人上下文之外,每个任务只需要一个步骤号和一个准备好的位。重要的是,它们共享一个堆栈。主例程可以简单到在任务列表中搜索就绪任务并调用不适当的步骤函数(使用特定于任务的表和“BRW”指令来分支到“GoTo”指令的表中)。任务步骤可以通过(例如)返回非零值来改变流程,非零值是任务内要执行的下一步工作的序号。伪优先级系统可以通过在主代码所扫描的任务列表中不止一次地包含高优先级任务来完成。我已经使用这种技术使用相对少的资源执行了相当多的任务。例如,我有一个节点,可以与两个LIN总线、两个I2C主接口、10个PWM、超时计时器等进行通信。系统中大约有20种不同的节点类型,它们都使用相同的任务框架。这种设计的缺点是您的主代码知道哪些任务存在,以及如何检测这些任务。此外,中断例程或ISR必须知道如何使任务“就绪”,以及哪些任务应该为给定的中断做好准备。这不是一种在任务代码和任务本身之间保持一条完全清晰的线的方法。但是,对于8位处理器,这种方法可能非常适合这个问题。我也做过像您所描述的那种系统——即使使用抢占式调度器。但是这些8位系统具有相当多的128字节RAM。通常,每个任务不仅有一个TCB,而且还有它自己的堆栈。你所描述的可以完成,我希望看到你成功。但是在你投入太多工作之前,考虑一下一个通用的多任务系统是否是解决问题的正确解决方案。GlennPEdit:“I/O边界”-&gt;“I/O完成等待”。添加单栈语句。语法/拼写修正。
2019-10-8 10:29:27 评论

举报

我没有在PIC汇编中编写太多程序,但是BSR寄存器没有修改。只是下一行C之后的一个movlw。我将尝试包括以下代码:
2019-10-8 10:38:50 评论

举报

南瓜软件产生小型RTOS,称为小型RAM计算机的齐射。他们生产16F的机器。他们的RTOS比我的要好,因为它使用较少的RAM。对于我所做的,我只有3到5个任务。它是合作的。我将包括TCB结构。我写这些RTOS是为了从我的公司销售。我过去的经验是做一个超级循环。但事情很快就会变得复杂起来。我的用于增强型中档机器,我计划使用PIC16F1825等芯片,带有1k的ram,但我的测试是在PIC12F1840上使用256字节的ram,以不同速率闪烁3个LED。增强的中程还允许我访问16级堆栈来插入和删除堆栈中的项。我只需要让步和延迟来完成我的大部分工作,任务通信是一个全局变量,一个任务只允许设置变量,另一个只能读取变量。一个任务将保持暂停,直到变量被设置,然后分支到收益率以执行进一步的代码。一个任务用于执行IO和填充缓冲区;另一个任务用于向我构建的I2C从机发出I2C命令;另一个任务用于读取缓冲区和执行命令;另一个任务用于控制消息缓冲区的LCD输出;其他任务用于填充缓冲区(通过它们之间的协作,并且很可能只能填充某个p液晶显示器的艺术。我不想透露太多,因为我打算出售的对象和来源,从我的业务。TCB结构如下:
2019-10-8 10:47:54 评论

举报

只有小组成员才能发言,加入小组>>

62个成员聚集在这个小组

加入小组

创建小组步骤

关闭

站长推荐 上一条 /10 下一条

快速回复 返回顶部 返回列表