博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一个sio.c的实现及遇到的多任务执行问题
阅读量:6813 次
发布时间:2019-06-26

本文共 3753 字,大约阅读时间需要 12 分钟。

/* KallistiOS ##version##   sio.c   Copyright (C)2004 Dan Potter*/#include 
#include
#include
#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

 上面这个实现似乎没有实现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 voidslipif_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可以看这篇博文

 

需要对整个系统的不同任务、优先级好好了解清楚。

对于高优先级任务,需要执行完就立刻挂起或阻塞,以让其它低优先级任务得以执行。

转载于:https://www.cnblogs.com/yanhc/p/8476643.html

你可能感兴趣的文章
input光标高度问题
查看>>
基础命令集合
查看>>
【转】poj pku 线段树题目20道汇总+简要算法+分类+难度
查看>>
python不同目录下的调用
查看>>
关于命令ride.py打不开RF,而是打开pycharm编辑器问题解决思路
查看>>
Codebook model 视频抠像 xp sp3 + vs2005 + OpenCV 2.3.1
查看>>
ffmpeg-20160714-git-bin.7z
查看>>
ListView下拉刷新实现(类似陌陌的箭头转动)
查看>>
[Android编程心得] Camera(OpenCV)自动对焦和触摸对焦的实现
查看>>
Android apk的安装、卸载、更新升级(通过Eclipse实现静默安装)
查看>>
关于新建android项目时 appcompat_v7报错问题的一点总结
查看>>
基于数据库复制的技术架构讨论
查看>>
SQLite介绍及使用
查看>>
css3实现内阴影
查看>>
杭电多校第一场补题-1002 Balanced Sequence
查看>>
jQuery学习笔记(一)
查看>>
第一课 矩阵的行图像与列图像(麻省理工公开课:线性代数)【转载】
查看>>
Screen Orientation for Windows Phone
查看>>
程序1:四则运算
查看>>
sqlplus无密码登录TNS协议适配器错误
查看>>