【位运算与嵌入式编程】

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 《程序员面试宝典(第四版)》 欧立奇 刘洋 段韬 编著

posted @ 2019-05-30 09:29  尚修能的技术博客  阅读(291)  评论(0编辑  收藏  举报