嵌入式开发者社区

标题: tcp_client+upp任务抢占问题 [打印本页]

作者: 70010x    时间: 2016-12-27 11:47
标题: tcp_client+upp任务抢占问题
我在程序里设置了两个任务,一个就是系统本身的tcp_test()任务,另一个是我自己创建的upp传输任务,在程序开始时,tcp_test()函数里有一个task_sleep()函数可以使任务跳转到低优先级的upp任务,这里没有问题,但是当tcp链接后,该函数原代码执行完成后我加入了一条task_sleep()指令,但此时程序却不能跳转到upp任务,请问这种情况怎么解决?帮我分析分析,谢谢了。

作者: 希望缄默    时间: 2016-12-27 14:56
SYS/BIOS 是基于优先级调度的实时操作系统 在某一时刻一定执行的是当前准备就绪的最高优先级线程
至于为什么没有调到 uPP 函数 你要确认是否满足
1、准备就绪
2、当前时刻优先级最高
作者: 70010x    时间: 2016-12-27 15:17
希望缄默 发表于 2016-12-27 14:56
SYS/BIOS 是基于优先级调度的实时操作系统 在某一时刻一定执行的是当前准备就绪的最高优先级线程
至于为什 ...

第一次Upp任务能够运行是task_sleep();函数的作用,之后被net.c文件里的hook函数抢占后就不能从tcp_test()任务跳转到upp任务了,我现在不知道它内部做了什么,也不好改动,我需要实现的是PC与DSP网口通讯,DSP与另一台设备并口通讯,这可能要改一些底层驱动的东西,希望您能给我一些思路。
作者: 希望缄默    时间: 2016-12-27 16:27
70010x 发表于 2016-12-27 15:17
第一次Upp任务能够运行是task_sleep();函数的作用,之后被net.c文件里的hook函数抢占后就不能从tcp_test( ...

Hook 函数只会在 NDK 协议栈初始化时候执行一次
不需要改底层驱动 这是上层调度问题 与驱动无关
作者: 70010x    时间: 2016-12-27 16:58
希望缄默 发表于 2016-12-27 16:27
Hook 函数只会在 NDK 协议栈初始化时候执行一次
不需要改底层驱动 这是上层调度问题 与驱动无关 ...

现在的问题是运行后如果tcp_test()函数里没有用到for(;;)循环,程序就不知道跑到哪里去了,但是如果用了for(;;)循环,又无法在接收数据后跳转到我的upp任务里面,希望您能给我一个思路。

作者: 70010x    时间: 2016-12-27 17:02
希望缄默 发表于 2016-12-27 16:27
Hook 函数只会在 NDK 协议栈初始化时候执行一次
不需要改底层驱动 这是上层调度问题 与驱动无关 ...

补充:如果没有for(;;)循环,程序执行完tcp_test()函数后到什么地方去了?请您给我指点,这个对我编写代码的思路影响很大。
作者: 电子微创意    时间: 2016-12-27 22:05
静静的听课
作者: 希望缄默    时间: 2016-12-28 08:48
70010x 发表于 2016-12-27 16:58
现在的问题是运行后如果tcp_test()函数里没有用到for(;;)循环,程序就不知道跑到哪里去了,但是如果用了f ...

在 for(;;) 里面添加 task_sleep 或者 task_yield
作者: 希望缄默    时间: 2016-12-28 08:51
70010x 发表于 2016-12-27 17:02
补充:如果没有for(;;)循环,程序执行完tcp_test()函数后到什么地方去了?请您给我指点,这个对我编写代 ...

一般执行 IDLE 空闲线程调度
所有的操作系统都是这样的 没有进程/任务在工作就在空闲进程/线程 Windows 也是[attach]1759[/attach]

作者: 70010x    时间: 2016-12-28 14:16
希望缄默 发表于 2016-12-28 08:48
在 for(;;) 里面添加 task_sleep 或者 task_yield

这个我之前就试过了如果加在tcp_test()函数里的for(;;)内的末尾加休眠或抢占指令,会重新回到for循环的第一条指令,如图1和图2[attach]1762[/attach][attach]1761[/attach]

如果tcp_test()函数内部不适用for(;;)循环,该函数末尾使用task_sleep()指令,一样不会跳转到低优先级的upp任务,如图3图4
[attach]1764[/attach][attach]1763[/attach]

补充:upp任务我在之前的使用也是正常的,在这里却不能跳转。

作者: 70010x    时间: 2016-12-28 14:18
希望缄默 发表于 2016-12-28 08:51
一般执行 IDLE 空闲线程调度
所有的操作系统都是这样的 没有进程/任务在工作就在空闲进程/线程 Windows  ...

我的upp任务的优先级是3,比空闲线程要高,而且空闲是失能的,但是结束后依旧无法跳转到upp任务,两种指令都没作用。
作者: 70010x    时间: 2016-12-28 15:44
希望缄默 发表于 2016-12-28 08:51
一般执行 IDLE 空闲线程调度
所有的操作系统都是这样的 没有进程/任务在工作就在空闲进程/线程 Windows  ...

补充:但是我在Semaphore_Binary例程设计不同指令的任务之间连续跳转都是没有问题的。
作者: 希望缄默    时间: 2016-12-29 09:00
70010x 发表于 2016-12-28 15:44
补充:但是我在Semaphore_Binary例程设计不同指令的任务之间连续跳转都是没有问题的。 ...

添加系统分析功能 看下任务调度过程
作者: 70010x    时间: 2016-12-30 13:58
希望缄默 发表于 2016-12-29 09:00
添加系统分析功能 看下任务调度过程

[attach]1781[/attach][attach]1782[/attach]
如图所示,无论我的taskMain()的优先级设置为多少都只运行一次,剩余的任务依次会执行,当服务器侦听到开发板后,tcp_test()任务停止,除taskMain()剩余的任务会一直增加,taskMain始终不能执行,看图似乎一直在执行SWI和HWI,有什么办法能让我灵活控制taskMain()任务?实在不行我只能taskmain写入tcp_test()里面了

作者: 希望缄默    时间: 2017-1-3 11:45
70010x 发表于 2016-12-28 14:16
这个我之前就试过了如果加在tcp_test()函数里的for(;;)内的末尾加休眠或抢占指令,会重新回到for循环的第 ...

Task_sleep 之前 post 一下 upp 任务的信号量
作者: 70010x    时间: 2017-1-9 14:44
希望缄默 发表于 2017-1-3 11:45
Task_sleep 之前 post 一下 upp 任务的信号量

[attach]1828[/attach]
出现新的错误。

作者: 70010x    时间: 2017-1-9 15:58
希望缄默 发表于 2017-1-3 11:45
Task_sleep 之前 post 一下 upp 任务的信号量

这个错误我找到原因了,是我的一个数组溢出了。
作者: 希望缄默    时间: 2017-1-12 09:38
70010x 发表于 2017-1-9 15:58
这个错误我找到原因了,是我的一个数组溢出了。






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