请教下各位用C语言的前辈,关于连接符“\”

[复制链接]
6204|14
 楼主| nqyijian 发表于 2011-10-6 15:04 | 显示全部楼层 |阅读模式
本帖最后由 nqyijian 于 2011-10-6 15:07 编辑

各位前辈大家好,小弟有个问题想请教下各位。小弟最近在苦想怎么模块化的更好。所以我把中断函数单独拉出来,然后在各个需要中断的模块里面宏定义中断处理程序,
以后需要用该中断的时候,直接把宏定义加入到中断函数中就可以了,方便。
但是宏定义一大段指令的时候会遇到连接符的问题。不连接会出错。程序如下
#define USART_RX_INT\
{
      if(RCIF && RCIE)
     {
          u8 Temp;
          if(FERR)           //帧错误处理
         {
               Temp = RCREG;
          }
          else if(OERR)   //溢出错误处理
         {
               CREN = 0; //溢出错误直接复位接收模块
               CREN = 1;
         }
         else
        {
               RX_WritePointer++;
               if(RX_WritePointer > 15)
              {
                        RX_WritePointer = 0;
               }
              Usart_RC_data_buff[RX_WritePointer] = RCREG;
         }
     }
}

想请教下各位,我该在哪些地方添加连接符才对?我试过把它们写在同一行能编译过去,但是那样实在不好看。谢谢各位
 楼主| nqyijian 发表于 2011-10-6 19:08 | 显示全部楼层
怎么没有热心人回答一下啊
西安农民工 发表于 2011-10-6 19:27 | 显示全部楼层
在if中还可以定义u8 Temp吗?
icecut 发表于 2011-10-6 19:39 | 显示全部楼层
俺不喜欢用宏定义。
sysdriver 发表于 2011-10-6 20:45 | 显示全部楼层
在if中还可以定义u8 Temp吗?
西安农民工 发表于 2011-10-6 19:27


难道是C++?
highgear 发表于 2011-10-6 22:19 | 显示全部楼层
这种做法不是很好, 模块化不是宏化。

连接符“\”,必须每一行的放一个,不仅仅是第一行。
祖平 发表于 2011-10-6 23:35 | 显示全部楼层
模块化时,可以用注册回调函数形式来封装
 楼主| nqyijian 发表于 2011-10-7 08:37 | 显示全部楼层
请问楼上注册回调函数是什么意思啊,怎么实现啊。
红金龙吸味 发表于 2011-10-7 14:49 | 显示全部楼层
注册回调函数,就是定义一个函数指针,然后需要将该指针指向你所要调用的函数。

ISR()
{
    if(g_pfnISRCallBack != NULL)
    {
           (*g_pfnISRCallBack)(NULL)//execute isr funciton  
    }
}

typedef void (*pfnISRCallBack)(void * pData);
//register isr callback function
void RegisterISRCallBack(pfnISRCallBack pfnISR)
{
    g_pfnISRCallBack = pfnISR;
}

模块化抓住一个要点就是模块与模块之间耦合性要低,模块自身内聚性要高。实现的思路多种多样。需要注意一点如果模块设计不好,会带来额外的资源消耗。

评分

参与人数 1威望 +1 收起 理由
highgear + 1

查看全部评分

potter 发表于 2011-10-7 15:21 | 显示全部楼层
不知道楼主是不是要这样的代码
#define USART_RX_INT   \

{ \
       if(RCIF && RCIE)\
      {\
           u8 Temp;\
           if(FERR)           /*帧错误处理*/ \
          {\
                Temp = RCREG;\
           }\
           else if(OERR)   /*溢出错误处理*/\
          {\
                CREN = 0; /*溢出错误直接复位接收模块*/ \
                CREN = 1;\
          }\
          else \
         {\
                RX_WritePointer++;\
                if(RX_WritePointer > 15)\
               {\
                         RX_WritePointer = 0;\
                }\
               Usart_RC_data_buff[RX_WritePointer] = RCREG;\
          }\
      }\
}
potter 发表于 2011-10-7 15:22 | 显示全部楼层
这样编译应该能过得
hjx5548 发表于 2011-10-7 16:34 | 显示全部楼层
宏定义
西安农民工 发表于 2011-10-7 17:25 | 显示全部楼层
在if中定义个变量,本身就就编不过。lz应该用的PICC编译器吧!
if(RCIF && RCIE)\
      {\
          u8 Temp;\
 楼主| nqyijian 发表于 2011-10-10 20:07 | 显示全部楼层
是的PICC的编译器,在if里面定义变量,可以正常使用啊
 楼主| nqyijian 发表于 2011-10-10 20:11 | 显示全部楼层
对于PIC单片机,堆栈数量固定了,太多的嵌套会出问题,所以不敢在中断里面再调用函数,不然容易堆栈溢出
您需要登录后才可以回帖 登录 | 注册

本版积分规则

75

主题

538

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部