硬汉嵌入式论坛

 找回密码
 立即注册
查看: 299|回复: 4
收起左侧

[FreeRTOS] STM32+Freertos

[复制链接]

1

主题

0

回帖

3

积分

新手上路

积分
3
发表于 2024-4-9 20:47:33 | 显示全部楼层 |阅读模式
大佬们,我用freertos创建2个串口控制上位机的任务,但是2个串口只能有一个能工作,单独测试的时候都没问题,串口接收是用中断去接收的

void WIFI_Task(void *Params)
{
        while (1)
        {
                if (WIFI_RX_STA & 0x8000)
                {
                        if(WIFI_MP3_State() == 0)
                        {
                                if (strstr((const char *)WIFI_RX_BUF, "Trash1"))
                                {
                                        MP3_Star(03);
                                        GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_RESET);
                                }
                                if (strstr((const char *)WIFI_RX_BUF, "Trash2"))
                                {
                                        MP3_Star(04);
                                        GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_SET);
                                }
                                WIFI_MP3_State() == 1;
//                                vTaskDelay(10);
//                                vTaskDelete(NULL);
                        }                       
                        memset(WIFI_RX_BUF, 0, 600); // 将接收区清0
                        WIFI_RX_STA = 0;                         // WIFI模块标志位清零
                }
        }
}

void BlueTooth_Task(void *Params)
{
        while(1)
        {
                if (BlueTooth_RxFlag == 1) // 蓝牙接收到手机发送的数据时
                {
                        switch (BlueTooth_RxData)
                        {
                                if (BlueTooth_MP3_State() == 0)
                                {
                                case '1':
                                        MP3_Star(04);
                                        GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_RESET);
                                        break;
                                case '2':
                                        MP3_Star(03);
                                        GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_SET);
                                        break;
                                default:
                                        break;
                                }
                                BlueTooth_MP3_State() == 1;
//                                vTaskDelay(10);
//                                vTaskDelete(NULL);
                        }
                        BlueTooth_RxFlag = 0; // 蓝牙模块标志位清零

                }
        }
}

void Start_Task(void *Param)
{
        LED_Init();
        MP3_Init();
        WIFI_Init();
        BlueTooth_Init();
       
        taskENTER_CRITICAL(); // 进入临界区

        xTaskCreate((TaskFunction_t)WIFI_Task,                                // 任务函数名
                                (const char *)"WIFI_Task",                                // 任务名称(字符串)
                                (configSTACK_DEPTH_TYPE)256,                        // 任务堆栈大小(128/...)
                                (void *)NULL,                                                        // 任务传递参数(NULL/...)
                                (UBaseType_t)1,                                                        // 任务优先级
                                (TaskHandle_t *)NULL // 任务句柄
        );

        xTaskCreate((TaskFunction_t)BlueTooth_Task,                                // 任务函数名
                                (const char *)"BlueTooth_Task",                                // 任务名称(字符串)
                                (configSTACK_DEPTH_TYPE)256,                        // 任务堆栈大小(128/...)
                                (void *)NULL,                                                        // 任务传递参数(NULL/...)
                                (UBaseType_t)1,                                                        // 任务优先级
                                (TaskHandle_t *)NULL // 任务句柄
        );
        taskEXIT_CRITICAL(); // 退出临界区
        vTaskDelete(NULL);         // 不加无法运行
}

int main(void)
{
        xTaskCreate((TaskFunction_t)Start_Task,                                 // 任务函数名
                                (const char *)"Start_Task",                                 // 任务名称(字符串)
                                (configSTACK_DEPTH_TYPE)512,                         // 任务堆栈大小(128/...)
                                (void *)NULL,                                                         // 任务传递参数(NULL/...)
                                (UBaseType_t)2,                                                         // 任务优先级
                                (TaskHandle_t *)NULL // 任务句柄
        );

        vTaskStartScheduler(); // 开启任务调度器
}


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106769
QQ
发表于 2024-4-10 09:07:06 | 显示全部楼层
两个串口是两个独立的硬件串口吗。

然后两个串口任务里面仅做个串口DR寄存器发送测试即可。
回复

使用道具 举报

19

主题

234

回帖

291

积分

高级会员

积分
291
发表于 2024-4-10 09:12:35 | 显示全部楼层
eric2013 发表于 2024-4-10 09:07
两个串口是两个独立的硬件串口吗。

然后两个串口任务里面仅做个串口DR寄存器发送测试即可。

老师,他这个是不是线程没有释放CPU的原因
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106769
QQ
发表于 2024-4-10 09:51:01 | 显示全部楼层
tovinz 发表于 2024-4-10 09:12
老师,他这个是不是线程没有释放CPU的原因

还是你看的仔细,真有可能。
回复

使用道具 举报

22

主题

67

回帖

133

积分

初级会员

积分
133
发表于 2024-4-10 16:17:27 | 显示全部楼层
tovinz 发表于 2024-4-10 09:12
老师,他这个是不是线程没有释放CPU的原因

你的意思是 让该任务sleep吗 但是中断不是应该比任务优先级高吗? cpu不用释放也会被中断抢占把
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-5 10:17 , Processed in 0.225258 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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