STM32,UCOS时间管理相关问题,请求解答
用的是stm32f103C8单片机,做一个东西的时候要求1秒钟大约要往串口中写1000个数据,这是东西的要求。现在采用的是UCOS的系统,但是实际中发现大约只能发到150个左右的数据/秒,而且可能是因为任务堆栈越堆越多,系统速度也越来越慢。
这个数据量不够应该是其他的任务调度把时间都占用了,但我想ADC也是一个任务,这任务的采样转换频率都可以达到1M,那为什么每秒1000个数据都发不出去??不能懂。。
然后我在网上也查了一下说是可以用把任务锁死的办法抢占CPU资源,不太明白什么意思,求吧内大神/老师指点一下
这是一个DMA串口的初始化!! 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);
} 可以尝试dma发送. 1000个8bit数据如果使用115200的波特率来发送,不算额外开销,需要65ms左右,算上额外开销,问题也不大。你把发送单独做一个任务,优先级高一点,调试的时候不妨设置最高的优先级,然后发送使用中断方式,中断和任务之间使用一个信号量来管理,问题应该不大,试试看
页:
[1]