OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5502|回复: 6

FreeRTOS-CLI移植

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2018-10-12
在线时间
1 小时
发表于 2018-10-12 17:34:33 | 显示全部楼层 |阅读模式
1金钱
在移植FreeRTOS-CLI时,发现CLI任务移植无法被执行,麻烦各位指教!谢谢

stm32f103rct_freertos_demo.zip

15.54 MB, 下载次数: 233

最佳答案

查看完整内容[请看2#楼]

使用STM32CubeMax默认的FreeRTOS配置只有3k,将其修改大一点就可以运行 #define configTOTAL_HEAP_SIZE ((size_t)15 * 1024)//((size_t)3072)
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2018-10-12
在线时间
1 小时
 楼主| 发表于 2018-10-12 17:34:34 | 显示全部楼层
使用STM32CubeMax默认的FreeRTOS配置只有3k,将其修改大一点就可以运行
#define configTOTAL_HEAP_SIZE                    ((size_t)15 * 1024)//((size_t)3072)
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2018-10-13 01:59:29 | 显示全部楼层
帮顶
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2018-10-13 02:00:12 | 显示全部楼层
帮顶
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2018-10-13 02:01:28 | 显示全部楼层
帮顶
回复

使用道具 举报

17

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
167
金钱
167
注册时间
2013-6-27
在线时间
78 小时
发表于 2019-1-10 16:08:37 | 显示全部楼层
刚问小哥,这个工程是哪个编译器的
回复

使用道具 举报

3

主题

95

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2451
金钱
2451
注册时间
2015-11-1
在线时间
300 小时
发表于 2019-11-29 12:29:52 | 显示全部楼层
本帖最后由 cos12a 于 2019-12-2 14:53 编辑

移植了,试了一下,为什么输入命令每次都会执行两次呢?
发送结尾\n\r就会执行两次,只有一个\n或\r就执行一次,可能是下面这个函数处理错误

static void prvUARTCommandConsoleTask( void *pvParameters )
{
        signed char cRxedChar;
        uint8_t ucInputIndex = 0;
        char *pcOutputString;
        static char cInputString[ cmdMAX_INPUT_SIZE ], cLastInputString[ cmdMAX_INPUT_SIZE ];
        BaseType_t xReturned;
//        xComPortHandle xPort;

        ( void ) pvParameters;

        /* Obtain the address of the output buffer.  Note there is no mutual
        exclusion on this buffer as it is assumed only one command console interface
        will be used at any one time. */
        pcOutputString = FreeRTOS_CLIGetOutputBuffer();

        /* Initialise the UART. */
        xPort = xSerialPortInitMinimal( configCLI_BAUD_RATE, cmdQUEUE_LENGTH );

        /* Send the welcome message. */
        vSerialPutString( xPort, ( signed char * ) pcWelcomeMessage, ( unsigned short ) strlen( pcWelcomeMessage ) );

        for( ;; )
        {
        HAL_IWDG_Refresh(&hiwdg);
                /* Wait for the next character.  The while loop is used in case
                INCLUDE_vTaskSuspend is not set to 1 - in which case portMAX_DELAY will
                be a genuine block time rather than an infinite block time. */
                while( xSerialGetChar( xPort, &cRxedChar, portMAX_DELAY ) != pdPASS );
//                HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET);
                /* Ensure exclusive access to the UART Tx. */
                if( xSemaphoreTake( xTxMutex, cmdMAX_MUTEX_WAIT ) == pdPASS )
                {
                        /* Echo the character back. */
                        xSerialPutChar( xPort, cRxedChar, portMAX_DELAY );

                        /* Was it the end of the line? */
                        if( cRxedChar == '\n' || cRxedChar == '\r' )    // 估计是这一句造成的。但是数据为什么没有将之前的数据用掉,还不太明白。
                        {
                                /* Just to space the output from the input. */
                                vSerialPutString( xPort, ( signed char * ) pcNewLine, ( unsigned short ) strlen( pcNewLine ) );

                                /* See if the command is empty, indicating that the last command
                                is to be executed again. */
                                if( ucInputIndex == 0 )
                                {
                                        /* Copy the last command back into the input string. */
                                        strcpy( cInputString, cLastInputString );
                                }

                                /* Pass the received command to the command interpreter.  The
                                command interpreter is called repeatedly until it returns
                                pdFALSE        (indicating there is no more output) as it might
                                generate more than one string. */
                                do
                                {
                                        /* Get the next output string from the command interpreter. */
                                        xReturned = FreeRTOS_CLIProcessCommand( cInputString, pcOutputString, configCOMMAND_INT_MAX_OUTPUT_SIZE );

                                        /* Write the generated string to the UART. */
                                        vSerialPutString( xPort, ( signed char * ) pcOutputString, ( unsigned short ) strlen( pcOutputString ) );

                                } while( xReturned != pdFALSE );

                                /* All the strings generated by the input command have been
                                sent.  Clear the input string ready to receive the next command.
                                Remember the command that was just processed first in case it is
                                to be processed again. */
                                strcpy( cLastInputString, cInputString );
                                ucInputIndex = 0;
                                memset( cInputString, 0x00, cmdMAX_INPUT_SIZE );

                                vSerialPutString( xPort, ( signed char * ) pcEndOfOutputMessage, ( unsigned short ) strlen( pcEndOfOutputMessage ) );
                        }
                        else
                        {
                                if( cRxedChar == '\r' )
                                {
                                        /* Ignore the character. */
                                }
                                else if( ( cRxedChar == '\b' ) || ( cRxedChar == cmdASCII_DEL ) )
                                {
                                        /* Backspace was pressed.  Erase the last character in the
                                        string - if any. */
                                        if( ucInputIndex > 0 )
                                        {
                                                ucInputIndex--;
                                                cInputString[ ucInputIndex ] = '\0';
                                        }
                                }
                                else
                                {
                                        /* A character was entered.  Add it to the string entered so
                                        far.  When a \n is entered the complete        string will be
                                        passed to the command interpreter. */
                                        if( ( cRxedChar >= ' ' ) && ( cRxedChar <= '~' ) )
                                        {
                                                if( ucInputIndex < cmdMAX_INPUT_SIZE )
                                                {
                                                        cInputString[ ucInputIndex ] = cRxedChar;
                                                        ucInputIndex++;
                                                }
                                        }
                                }
                        }

                        /* Must ensure to give the mutex back. */
                        xSemaphoreGive( xTxMutex );
                }
        }
}


if( cRxedChar == '\n' || cRxedChar == '\r' )    // 估计是这一句造成的。但是数据为什么没有将之前的数据用掉,还不太明白。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 22:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表