4回答

0收藏

STM32,UCOS时间管理相关问题,请求解答

#开源分享 #开源分享 2423 人阅读 | 4 人回复 | 2015-04-13

用的是stm32f103C8单片机,做一个东西的时候要求1秒钟大约要往串口中写1000个数据,这是东西的要求。
现在采用的是UCOS的系统,但是实际中发现大约只能发到150个左右的数据/秒,而且可能是因为任务堆栈越堆越多,系统速度也越来越慢。
这个数据量不够应该是其他的任务调度把时间都占用了,但我想ADC也是一个任务,这任务的采样转换频率都可以达到1M,那为什么每秒1000个数据都发不出去??不能懂。。
然后我在网上也查了一下说是可以用把任务锁死的办法抢占CPU资源,不太明白什么意思,求吧内大神/老师指点一下
分享到:
回复

使用道具 举报

回答|共 4 个

倒序浏览

沙发

andy_wsj

发表于 2015-4-13 18:09:14 | 只看该作者

1000个8bit数据如果使用115200的波特率来发送,不算额外开销,需要65ms左右,算上额外开销,问题也不大。你把发送单独做一个任务,优先级高一点,调试的时候不妨设置最高的优先级,然后发送使用中断方式,中断和任务之间使用一个信号量来管理,问题应该不大,试试看
板凳

Mandelbrot_Set

发表于 2015-4-14 09:02:21 | 只看该作者

可以尝试dma发送.
▽·▽×A = 0
地板

在途中

发表于 2015-4-20 17:29:50 | 只看该作者

DMA速度快!!
void DMA4_Config(void)
{
    DMA_InitTypeDef DMA_InitStructure;

        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);        //开启DMA时钟
//        Motor_USART_NVIC_Config                                   //配置DMA中断

        /*设置DMA源:内存地址&串口数据寄存器地址*/
    DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&USART1->DR);  //USART1_DR_Base;          

        /*内存地址(要传输的变量的指针)*/
    DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SendMotor1Buff;
       
        /*方向:从内存到外设*/               
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;       
       
        /*传输大小DMA_BufferSize=SENDBUFF_SIZE*/       
    DMA_InitStructure.DMA_BufferSize = 8;
       
        /*外设地址不增*/            
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
       
        /*内存地址自增*/
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;       
       
        /*外设数据单位*/       
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
       
        /*内存数据单位 8bit*/
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;         
       
        /*DMA模式:一次传输,循环*/
    DMA_InitStructure.DMA_Mode =  DMA_Mode_Circular ;         //        DMA_Mode_Normal ;//  
       
        /*优先级:中*/       
    DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;  
       
        /*禁止内存到内存的传输        */
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
       
        /*配置DMA1的4通道*/                  
    DMA_Init(DMA1_Channel4, &DMA_InitStructure);           
        USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);
        DMA_ITConfig(DMA1_Channel4, DMA_IT_TC, ENABLE);

   //DMA_ITConfig(DMA1_Channel4, DMA_IT_TC|DMA_IT_TE, ENABLE);
}
5#

在途中

发表于 2015-4-20 17:30:22 | 只看该作者

这是一个DMA串口的初始化!!
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条