【位运算与嵌入式编程】
1
中断是嵌入式系统中重要的组成部分,这导致很多编译开发商提供一种拓展,让标准C支持中断,其事实是,产生了一个新的关键字,
_interrupt,请看下面的程序(一个中断服务的ISR),请指出这段代码的错误。
interrupt double compute_area(double radius)
{
double area = PI * radius * radius;
printf("\n Area = %f",area);
return area;
}
解答:
1 中断服务子程序不能返回一个值
2 中断服务子程序不能接受一个参数]
如下是STM32F307的一个中断响应函数
/*******************************************
Description: 串口1的中断响应函数
Input: 无
Ouput: 无
Return: 无
Others: 无
*********************************************/
void USART1_IRQHandler()
{
static uint8_t i = 0; //静态变量
//判断中断标志位
if(USART_GetITStatus(USART1,USART_IT_RXNE)==SET)
{
USART_ClearITPendingBit(USART1,USART_IT_RXNE); //清除中断标志位
RF_DATA[i] = USART_ReceiveData(USART1); //读取串口数据
bind_count++;
if(RF_DATA[0] == 0X66)
{
i++;
if(i == 13)
{
RF_DATA_SUCCES = true;
i = 0;
}
}
if(bind_flag == true || two_point_four_bind_flag == false)
{
bind_flag = false;
if(RF_DATA[0] == 0XAA)
{
two_point_four_bind_flag = true;
}
}
}
}
3 在许多处理器/编译器中,浮点一般都是不可重入的,有些处理器/编译器需要让额外的寄存器入栈,有些处理器/编译器就不允许在中断服务子程序
里做浮点运算。此外中断服务子程序应该是短而有效率的,在中断服务子程序里做浮点运算是不明智的。
4 printf()经常有重入和性能上的问题,所以一般不使用printf()
参考资料:
1 《程序员面试宝典(第四版)》 欧立奇 刘洋 段韬 编著
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步