嵌入式开发者社区

标题: 创建软件中断swi的问题 [打印本页]

作者: sodjfsoidfjosj    时间: 2017-3-4 10:44
标题: 创建软件中断swi的问题
最近在做基于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_sysbios_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")
应该是声明不符合。
请问大家我这里是哪里出问题了。请大家多多指教。谢谢!



作者: sodjfsoidfjosj    时间: 2017-3-4 11:20
if (h==1)是要在我接收到数据之后,h=1,再发布软件中断。
作者: 希望缄默    时间: 2017-3-4 14:21
sodjfsoidfjosj 发表于 2017-3-4 11:20
if (h==1)是要在我接收到数据之后,h=1,再发布软件中断。

read_data 函数原型发出来?
作者: sodjfsoidfjosj    时间: 2017-3-4 15:21
希望缄默 发表于 2017-3-4 14:21
read_data 函数原型发出来?

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回来。
作者: sodjfsoidfjosj    时间: 2017-3-4 15:35
希望缄默 发表于 2017-3-4 14:21
read_data 函数原型发出来?

我把我工程压缩了一下发到你的工作qq上了。如果您有时间,可以帮我看一下吗?非常感谢。
作者: sodjfsoidfjosj    时间: 2017-3-4 16:49
希望缄默 发表于 2017-3-4 14:21
read_data 函数原型发出来?

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

读取接收用的是同一个 Socket 还是两个?
作者: sodjfsoidfjosj    时间: 2017-3-7 10:20
用的同一个socket,socket是在接收函数中创建的。读的函数直接使用这个socket不可以吗?
作者: sodjfsoidfjosj    时间: 2017-3-7 10:20
希望缄默 发表于 2017-3-7 08:40
读取接收用的是同一个 Socket 还是两个?

用的同一个socket,socket是在接收函数中创建的。读的函数直接使用这个socket不可以吗?




欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) Powered by Discuz! X3.4