查看: 2130|回复: 4

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

[复制链接]

该用户从未签到

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

使用道具 举报

  • TA的每日心情
    开心
    2015-4-13 18:10
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2015-4-13 18:09:14 | 显示全部楼层
    1000个8bit数据如果使用115200的波特率来发送,不算额外开销,需要65ms左右,算上额外开销,问题也不大。你把发送单独做一个任务,优先级高一点,调试的时候不妨设置最高的优先级,然后发送使用中断方式,中断和任务之间使用一个信号量来管理,问题应该不大,试试看
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2019-8-1 16:41
  • 签到天数: 1014 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2015-4-14 09:02:21 | 显示全部楼层
    可以尝试dma发送.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2015-4-21 18:11
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 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);
    }
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2015-4-21 18:11
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2015-4-20 17:30:22 | 显示全部楼层
    这是一个DMA串口的初始化!!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

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



    手机版|小黑屋|与非网

    GMT+8, 2024-11-24 03:06 , Processed in 0.175669 second(s), 23 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.