创龙科技
直播中

陈刚

7年用户 162经验值
私信 关注

创建软件中断swi编译器会报错

[tr] 最近在做基于NDK_TCP_Client例程,实现接收和读取指令的功能,并将接收和读取独立出来,其中接收指令使用for(;;)一直循环接收,读取指令是使用软件中断创建swi,设定每过一段时间定时读取一次,读取和接收的函数都已经写好。但是根据例程和教学视频模仿创建swi之后,编译器会报错。代码如下:

int main()
{
        // 创建一个信号量
        sem = Semaphore_create(0, NULL, NULL);

        // 平台初始化
        PlatformInit();

        Task_create(taskMain,NULL,NULL);

        // 启动 SYS/BIOS 系统
    BIOS_start();
}
void taskMain(UArg a0 ,UArg a1)
{
            Swi_Handle swi0;

            Swi_Params swiParams;
            Swi_Params_init(&swiParams);
            // 两个参数
            swiParams.arg0 = 2;
            swiParams.arg1 = 0;
            // 优先级
            swiParams.priority = 5;
            // 触发
            swiParams.trigger = 1;
            swi0 = Swi_create(read_data, &swiParams, NULL);
}
void swi_publish(UArg arg)
{
        if(h == 1)
        {
                Swi_andn(swi0,1);
        }
}
系统报错如下:
error #148: declaration is incompatible with "const ti_sy***ios_knl_Swi_Handle swi0" (declared at line 17 of "C:/Users/Admin/workspace_v5_5/myproject/NDK_TCP_Client_ok/Debug/configPkg/package/cfg/app_pe66.h")
应该是声明不符合。
请问大家我这里是哪里出问题了。请大家多多指教。谢谢!



[/tr]

回帖(7)

袁嫚玲

2019-7-2 12:36:35

read_data 函数原型发出来?
举报

王娟

2019-7-2 12:47:29


Void read_data(UArg a0, UArg a1)
{
                        p = memchr(Data1+out,'@',2);
                        if(p){
                                p1 = memchr(Data1+out,'#',40);
                                if(p1){
                                        p2 = (char *)p1-(char *)p-1;
                                        memset(bufs1,NULL,sizeof(bufs1));
                                        memmove(bufs1,Data1+1+out,p2);
                                        memset(Data1+out,NULL,p2+2);
                                        out = out+p2+2;
                                }else{
                                        //@之后找不到#
                                }
                        }else{
                                out = 0;
                        }
                        if(((pianyi + pBuflen >= out)&&(pianyi< out))||((curent_bufs_len > (max-pianyi)) && (curent_bufs_len >out) ) ) //缓冲区已满
                        {
                                pBuf2 = "环形缓冲区已满,请暂停发送";
                            send(s, pBuf2, 30, 0 );
                            //hold = -1;

                        }
           // 回传接受到的数据
                if(send(s, bufs1,p2 , 0 ) < 0)
                {
                return;
            }
                        //send(s, bufs1, p2, 0 );
                        //Task_sleep(100);  // 100表示系统时钟计数

}

实际上就是一个判断开头为@结尾为#的,就把中间的截取出来作为一个buf1 send回来。
举报

李泓翔

2019-7-2 13:02:15


我把我工程压缩了一下发到你的工作qq上了。如果您有时间,可以帮我看一下吗?非常感谢。
举报

李泽明

2019-7-2 13:07:47


我是想完成一个以太网通讯,基于NDK_TCP_Client例程,接收数据用一个无条件的for(;;)循环一直准备接收,读取数据用创建一个task,在task中发布一个软件中断swi,然后每10000个时间周期就读取一次,抢占掉接收数据的for(;;)循环,执行完read_data函数之后sleep,然后回到for(;;)里继续接收数据。但是实际测试的时候,似乎不是这个样子的。所以我想问一下,我这个大方向上或者逻辑上是不是出现了问题。

读取接收用的是同一个 Socket 还是两个? 
举报

更多回帖

发帖
×
20
完善资料,
赚取积分