测试ST 官网的 FreeRTOS
移植shell
主要是串口对接, 需要重写两个函数
int fputc(int ch, FILE *f)
{
/* Place your implementation of fputc here */
/* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, UART_TIMEOUT_VALUE);
return ch;
}
// #endif
char shell_buf[RXBUFFERSIZE]={0};
char shell_len=0;
char *shell_buf_head=NULL;
int fgetc(FILE *f)
{
while (0 == shell_len) {
osDelay(1);
}
char ch = *shell_buf_head;
shell_buf_head ++;
shell_len --;
return ch;
}增加了一个回调函数, 收到数据拷贝到shell_buf, 然后重新初始化串口中断接收参数,指针,size,count
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
{
/* Set transmission flag: transfer complete */
if(UartHandle->Instance == USART1) {
// UartReady = SET;
shell_len = UartHandle->pRxBuffPtr - aRxBuffer;
shell_buf_head = shell_buf;
memcpy(shell_buf, aRxBuffer, shell_len);
UartHandle->pRxBuffPtr = aRxBuffer;
UartHandle->RxXferSize = RXBUFFERSIZE;
UartHandle->RxXferCount = RXBUFFERSIZE;
}
}
遇到的问题, 1. fgetc 不能直接调用HAL_UART_Receive, 否则会死等,导致其他任务无法运行。
解决这个问题的方法是,接收采用中断方式。
问题2. STM32CubeMX 生成的代码,串口中断接收是固定长度的方式, 对于shell 不适用。
解决这个问题的方法是,修改中断处理程序,如果是调试用的串口,直接处理接收数据
static void UART_RxISR_8BIT(UART_HandleTypeDef *huart)
{
uint16_t uhMask = huart->Mask;
uint16_t uhdata;
/* Check that a Rx process is ongoing */
if (huart->RxState == HAL_UART_STATE_BUSY_RX)
{
uhdata = (uint16_t) READ_REG(huart->Instance->RDR);
*huart->pRxBuffPtr = (uint8_t)(uhdata & (uint8_t)uhMask);
huart->pRxBuffPtr++;
huart->RxXferCount--;
if(USART1 == huart->Instance) {
HAL_UART_RxCpltCallback(huart);
}
if (huart->RxXferCount == 0U) {
/* Disable the UART Parity Error Interrupt and RXNE interrupts */
CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE));
/* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) */
CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);
/* Rx process is completed, restore huart->RxState to Ready */
huart->RxState = HAL_UART_STATE_READY;
/* Clear RxISR function pointer */
huart->RxISR = NULL;
#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
/*Call registered Rx complete callback*/
huart->RxCpltCallback(huart);
#else
/*Call legacy weak Rx complete callback*/
HAL_UART_RxCpltCallback(huart);
#endif /* USE_HAL_UART_REGISTER_CALLBACKS */
}
}
else
{
/* Clear RXNE interrupt flag */
__HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST);
}
}
问题3. shell 放在Mgr task里面,由于内存分配128*4 不够导致死机
解决这个问题的方法是,去掉没有用的shell 指令,限制最多支持64条指令。 任务内存分配加大 256*4
最终效果图

版权声明:本文为shunrenwang原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。