Questions tagged «sleep»


5
Cortex(ARM)微控制器上的WFI(等待中断)的最佳模式
我正在研究使用EFM Gekko控制器(http://energymicro.com/)来开发电池供电的软件,并且希望该控制器在无用的情况下都能入睡。WFI(等待中断)指令用于此目的。它将使处理器进入睡眠状态,直到发生中断。 如果通过在某个地方存储东西来进行睡眠,则可以使用独占负载/独占存储操作来执行以下操作: //每当发生某事时,dont_sleep都会加载2 //应该强制主循环至少循环一次。如果有中断 //在以下语句中导致将其重置为2, //行为就像中断发生在它之后一样。 store_exclusive(load_exclusive(dont_sleep)>> 1); while(!dont_sleep) { //如果下一条语句与store_exclusive之间发生中断,请不要入睡 load_exclusive(SLEEP_TRIGGER); 如果(!dont_sleep) store_exclusive(SLEEP_TRIGGER); } 如果在load_exclusive和store_exclusive操作之间发生中断,则将导致跳过store_exclusive,从而使系统再循环运行一次(以查看中断是否设置了dont_sleep)。不幸的是,Gekko使用WFI指令而不是写地址来触发睡眠模式。像这样写代码 如果(!dont_sleep) WFI(); 冒着可能在'if'和'wfi'之间发生中断并设置dont_sleep的风险,但是wfi仍会继续执行。防止这种情况的最佳方式是什么?将PRIMASK设置为1以防止中断在执行WFI之前中断处理器,并在之后立即将其清除?还是有更好的技巧? 编辑 我想知道事件位。通过一般描述,它想用于多处理器支持,但是想知道是否可以使用以下内容: 如果(dont_sleep) SEV(); / *将使以下WFE清除事件标志但不休眠* / WFE(); 设置don_t_sleep的每个中断也应执行SEV指令,因此,如果该中断发生在“ if”测试之后,则WFE将清除事件标志,但不会进入睡眠状态。听起来像是一个好范例吗?
18 arm  cortex-m3  sleep 


3
单片机睡眠竞赛条件
给定一个运行以下代码的微控制器: volatile bool has_flag = false; void interrupt(void) //called when an interrupt is received { clear_interrupt_flag(); //clear interrupt flag has_flag = true; //signal that we have an interrupt to process } int main() { while(1) { if(has_flag) //if we had an interrupt { has_flag = false; //clear the interrupt flag …

1
检测哪个瞬时开关导致STM32 cpu唤醒
编辑:这个问题是错误的。stm325105只有一个唤醒引脚。但是其他ST部分具有多个唤醒引脚,因此给定的答案对此有效。 我有一个stm32f105,其中有两个连接到唤醒输入的瞬时按钮。处理器被置于待机模式。当按下任意按钮或RTC计时器触发时,CPU会唤醒。 问题是我希望CPU根据触发的唤醒输入执行不同的操作。根据5.3.5从ST stm32f105xx参考手册,没有寄存器被保留,除了表明我们已经唤醒状态寄存器(但不是以谁)和42个备份寄存器。 待机模式可实现最低功耗。它基于Cortex®-M3深度睡眠模式,禁用了稳压器。因此,1.8 V域已关闭电源。PLL,HSI振荡器和HSE振荡器也被关闭。除了备份域和备用电路中的寄存器外,SRAM和寄存器内容都会丢失。 从待机模式唤醒后,程序执行将以与复位后相同的方式重新开始(启动引脚采样,获取向量复位等)。电源控制/状态寄存器(PWR_CSR)中的SBF状态标志指示MCU处于待机模式。 此ST论坛帖子,如何确定从待机状态唤醒的起源?,表明我无法检测到软件中触发了哪种唤醒。我发现那里没有其他可以给人更多启发的帖子。 唤醒后,如何使用软件或硬件确定触发了哪个唤醒输入?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.