历史上的今天
今天是:2025年02月05日(星期三)
2021年02月05日 | 51单片机return怎么用?单片机return的用法
2021-02-05 来源:eefocus
函数写法1:
u8 is_timeout(tick start_time, tick interval)
{
return (get_diff_tick(get_tick(), start_time) > interval);
}
函数写法2:
u8 is_timeout(tick start_time, tick interval)
{
u8 status;
status = get_diff_tick(get_tick(), start_time) > interval);
return status;
}
函数调用方式:
if (is_timeout(start_time, 1000))
{
do_something();
}
问题:在有中断应用的平台上,使用函数写法1可能会造成if语句判断不正确。明明不到1000ms时间,却进入了do_something()。
分析:在51平台,默认情况下函数的调用、中断的切换,并不会将被打断函数的参数、局部变量压入栈,而是存储在固定存储区中。如果在执行return之前恰好需要去执行中断,则51的参数和局部变量值是可以被保存在固定存储区的,而中间数据(如return方式1中,需要返回的值)是不能被保存的,当中断返回后,无法正确获得先前的中间数据,而直接将不定数据返回,造成程序逻辑出错。而我们将return方式改为方式二,则可以保留参数、局部变量,返回正确的值,保证程序逻辑正确。
上一篇:51单片机时钟电路原理图解
史海拾趣
|
S3c610 Codec移植的工作经验总结[bootloader级] 1. S3C6410与WM9713的I2S,AC97,PCM相比较: 1.I2S,AC97,PCM是不同的,各是各的,三者时序不同,要双方通信,必须要是 同一种时序,要么均是I2S,要么均是AC97,要么均是PCM 2.S3C6410的I2S,AC97,PCM复用同一组Pin脚,但同一时间只能用一种类型 ...… 查看全部问答> |
|
前几天拿到一个mini2440,板子很精致。400M的主频,在跑uCos2的时候,发现速度很慢,可是却不知道为什么。怀疑是cache没有利用起来,可是我对于MMU也不是很明白,有没有点建议? void MMU_Init(void) { int i,j; / ...… 查看全部问答> |
|
本人在使用该芯片过程中遇到一些问题,想请有经验的朋友指教一下。 本人用720极的圆感应同步器作为角度传感器,想利用AD2S80来解码。 激磁信号使用的是5Khz的正弦波,AD2S80设置的分辨率为12位,该芯片的外围电路完全按照芯片手册上的针对5KHZ/12 ...… 查看全部问答> |
|
对于FPGA芯片,在上电的时候从EPCS内加载配置文件的信息,我想知道数据从EPCS传输到FPGA的过程中,是否存在冗余校验,就像422,485等通信过程中存在的校验。或者,我想为FPGA的*.pof文件内是否存有数据的冗余校验信息。谢谢… 查看全部问答> |
|
Firmware Lib的应用及C++工程建立过程杂谈Firmware Lib下在地址:http://www.st.com/stonline/products/support/micro/files/um0427.zipFirmware Lib用户手册下载地址:http://www.st.com/stonline/products/literature/um/134 ...… 查看全部问答> |
|
有没有一款好的STM8/32的烧写仿真器,大家推荐一下。 我先前有的是ST LINK ,用了快一年,用坏了4个ST LINK,有什么替代的东西吗? 再问一下,STM8还有什么烧写器?… 查看全部问答> |
|
在增计数模式下设置了: CCR0 = 0x0fff; TACTL = TASSEL1 + MC1 + TAIE CCTL0 = CCIE; GIE 也置位了, 在TAR计数到0xffff时不能进中断!… 查看全部问答> |




