一个sio.c的实现及遇到的多任务执行问题
2018-02-26 23:18
309 查看
https://sourceforge.net/p/cadcdev/lwip/ci/491e00038f26dc5d775f120aa49519a066819ebf/tree/kos/sio.c
上面这个实现似乎没有实现block
下面的实现,一开始while死循环处没有加Delay(1);,结果,其它任务根本起不来,
后来,加了一个Delay(1);之后,其它任务就能起来了。
即使没有Delay(1);,任务调度不是也应该能调度其它任务吗???
另外,上面没有实现多字节读取,读取len个,也没有实现abort,可以参考最开始的例子。
目前系统中所有任务的优先级分配如下,空闲任务优先级为0,最大优先级是8:
Main_task 1
ToggleLed4 2
tcpip task 6
udp task 5
eth input 7
slip input 7
slip接收任务如下:
slip接收任务是死循环,没有自动结束,而且优先级是最高的7,因此,slip任务会一直运行,其它任务都无法打断(led、udp任务无法执行)。
在read的while中加Delay(1);可以,而且,这里的Delay(1)得是用的操作系统的delay,如下:
vTaskDelay就是FreeRTOS操作系统自带的延时函数。因为,操作系统在执行该任务的delay过程中,会去执行其它任务,因此,其它低优先级任务得以继续执行。
如果delay这里用for 100次的这种方式,仍然是不行的,操作系统仍然不能切换到其它任务。
关于vTaskDelay可以看这篇博文http://blog.csdn.net/zhzht19861011/article/details/51705148
需要对整个系统的不同任务、优先级好好了解清楚。
对于高优先级任务,需要执行完就立刻挂起或阻塞,以让其它低优先级任务得以执行。
/* KallistiOS ##version## sio.c Copyright (C)2004 Dan Potter */ #include <dc/scif.h> #include <kos/thread.h> #include <lwip/lwip.h> #include "lwip/sio.h" /* This implements the serial I/O interface for lwIP to use PPP for serial connections. This hooks straight to dbgio right now but could easily be swapped over to use the modem stuff. */ static volatile int sio_abort = 0; sio_fd_t sio_open(u8_t foo) { int i; sio_abort = 0; // Clear out anything in the buffer already i = 0; while (scif_read() != -1) i++; if (i) printf("sio: cleared %d initial chars\n", i); return NULL; } void sio_send(u8_t ch, sio_fd_t foo) { scif_write(ch); scif_flush(); } u8_t sio_recv(sio_fd_t foo) { int ch; do { ch = scif_read(); if (ch == -1) thd_sleep(10); } while (ch == -1 && !sio_abort); sio_abort = 0; return ch; } // I *think* this is right, but sio_* seems to be totally // undocumented like so many things in lwIP. u32_t sio_read(sio_fd_t foo, u8_t *outbuf, u32_t bufmax) { int i, ch; for (i=0; i<bufmax && !sio_abort; i++) { ch = scif_read(); if (ch == -1) { if (i == 0) { thd_sleep(10); i--; continue; } else break; } outbuf[i] = ch; } sio_abort = 0; return i; } // Ditto on the comment for sio_read. u32_t sio_write(sio_fd_t foo, u8_t *buf, u32_t buflen) { int i; for (i=0; i<buflen && !sio_abort; i++) scif_write(buf[i]); scif_flush(); sio_abort = 0; return buflen; } void sio_read_abort(sio_fd_t foo) { sio_abort = 1; printf("sio_read_abort called\n"); while (sio_abort) thd_sleep(10); }
上面这个实现似乎没有实现block
下面的实现,一开始while死循环处没有加Delay(1);,结果,其它任务根本起不来,
后来,加了一个Delay(1);之后,其它任务就能起来了。
即使没有Delay(1);,任务调度不是也应该能调度其它任务吗???
/** * Reads from the serial device. * * @param fd serial device handle * @param data pointer to data buffer for receiving * @param len maximum length (in bytes) of data to receive * @return number of bytes actually received - may be 0 if aborted by sio_read_abort * * @note This function will block until data can be received. The blocking * can be cancelled by calling sio_read_abort(). */ u32_t sio_read(sio_fd_t fd, u8_t *data, u32_t len) { if(len >= 1) { if(fd.UartNo == 1) { while(USART_GetITStatus(USART1, USART_IT_RXNE) == RESET) {Delay(1);} { *data =(u8)USART_ReceiveData(USART1); return 1; } } else if(fd.UartNo == 3) { while(USART_GetITStatus(USART3, USART_IT_RXNE) == RESET) { *data =(u8)USART_ReceiveData(USART3); return 1; } } else if(fd.UartNo == 5) { while(USART_GetITStatus(UART5, USART_IT_RXNE) == RESET) { *data =(u8)USART_ReceiveData(UART5); return 1; } } else if(fd.UartNo == 6) { while(USART_GetITStatus(USART6, USART_IT_RXNE) == RESET) { *data =(u8)USART_ReceiveData(USART6); return 1; } } } return 0; }
另外,上面没有实现多字节读取,读取len个,也没有实现abort,可以参考最开始的例子。
目前系统中所有任务的优先级分配如下,空闲任务优先级为0,最大优先级是8:
Main_task 1
ToggleLed4 2
tcpip task 6
udp task 5
eth input 7
slip input 7
slip接收任务如下:
#if SLIP_USE_RX_THREAD /** * The SLIP input thread. * * Feed the IP layer with incoming packets * * @param nf the lwip network interface structure for this slipif */ static void slipif_loop_thread(void *nf) { u8_t c; struct netif *netif = (struct netif *)nf; struct slipif_priv *priv = (struct slipif_priv *)netif->state; while (1) { if (sio_tryread(priv->sd, &c, 1) > 0) { slipif_rxbyte_input(netif, c); } } } #endif /* SLIP_USE_RX_THREAD */
slip接收任务是死循环,没有自动结束,而且优先级是最高的7,因此,slip任务会一直运行,其它任务都无法打断(led、udp任务无法执行)。
在read的while中加Delay(1);可以,而且,这里的Delay(1)得是用的操作系统的delay,如下:
/** * @brief Inserts a delay time. * @param nCount: number of Ticks to delay. * @retval None */ void Delay(uint32_t nCount) { vTaskDelay(nCount); }
vTaskDelay就是FreeRTOS操作系统自带的延时函数。因为,操作系统在执行该任务的delay过程中,会去执行其它任务,因此,其它低优先级任务得以继续执行。
如果delay这里用for 100次的这种方式,仍然是不行的,操作系统仍然不能切换到其它任务。
关于vTaskDelay可以看这篇博文http://blog.csdn.net/zhzht19861011/article/details/51705148
需要对整个系统的不同任务、优先级好好了解清楚。
对于高优先级任务,需要执行完就立刻挂起或阻塞,以让其它低优先级任务得以执行。
相关文章推荐
- 【orange】OrangeS一个操作系统的实现:第四章实践方面遇到的一些问题
- 单步执行遇到的离奇问题?一个简单的赋值语句都执行失败的bug
- orange's一个操作系统的实现实验遇到的问题及处理方法
- PHP 正则 中遇到的一个小问题, 卡死,执行慢
- 项目实现过程中遇到的问题记录(一)------------使用AsyncTask时,doInBackground没有立即执行
- CSDN博客:对于一个程序员,写程序就是实现功能,遇到具体问题,解决这个问题,并记录问题到CSDN上,从而有所提高和互相帮助。
- 遇到的一个设计问题,两种方法的实现
- 借助cookie实现子网页修改父网页内容遇到的问题:同一个浏览器访问相同页面,会互相影响。 (已解决)
- 一个360 Droidplugin的运用,实现支付插件化,以及插件化实现时遇到的一些问题
- fnzi今天遇到一个事务问题,转载一篇文章,以示鼓励(五种spring事务实现方式)
- 在tp3.2.3中使用 FormData 对象实现表单的文件上传功能遇到的一个问题及解决方法
- 遇到一个问题,网站可以实现让客户不能加入收藏夹吗?
- maven插件tomcat7:run执行时遇到了一个问题
- 实现一个支持正则匹配的Filter以及Spring管理Filter遇到的问题
- 捕捉enter事件实现搜索功能时遇到的一个怪异问题
- 在Hive中执行DDL之类的SQL语句时遇到的一个问题
- 实现鼠标钩子遇到的一个问题
- 开发中遇到的一个关于 SQL 语句执行的问题
- Touch001项目实现过程中遇到的一个技术问题
- 最近遇到一个非常棘手的需求是关于邮件转发的问题,请大家来帮忙给出出主意如何实现。