sysbios Semaphore_Binary例程疑问 - TMS320C6748 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2757|回复: 1

[未解决] sysbios Semaphore_Binary例程疑问

[复制链接]

8

主题

21

帖子

1198

积分

金牌会员

Rank: 6Rank: 6

积分
1198
发表于 2021-9-2 10:50:24 | 显示全部楼层 |阅读模式
本帖最后由 shxsxlh 于 2021-9-2 10:53 编辑

c6748 EVM开发板的Semaphore_Binary,例程中添加了运行信息的打印代码,从打印信息来看,信号量为0时,此时TaskCoreLED2被挂起,但是依然会执行TaskCoreLED2中的语句,这是为什么?
Int main()
{
        PSCInit();                     // 外设使能配置
        GPIOBankPinMuxSet();  // 管脚复用配置
        GPIOBankPinInit();        // GPIO 管脚初始化
        
        Semaphore_Params semParams;      // 创建一个信号量
        Semaphore_Params_init(&semParams);
        semParams.mode = Semaphore_Mode_BINARY;
        sem = Semaphore_create(1, &semParams, NULL);
        
        Task_Params taskParams;               // 创建两个任务
        Task_Params_init(&taskParams);
        taskParams.priority = 1;
        tsk1 = Task_create(TaskCoreLED1, &taskParams, NULL);

        Task_Params_init(&taskParams);
        taskParams.priority = 2;
        tsk2 = Task_create(TaskCoreLED2, &taskParams, NULL);

        BIOS_start();     // 启动 SYS/BIOS 系统
        return(0);
}

// 任务线程TaskCoreLED2,优先级为2
Void TaskCoreLED2(UArg a0, UArg a1)
{
        while(1)
        {
                if(Semaphore_getCount(sem) == 0)
                {
                        System_printf("TaskCoreLED2 任务被挂起\n");
                }

                System_printf("TaskCoreLED2 任务 计数值(之前):%d\n", Semaphore_getCount(sem));
                // 挂起
                Semaphore_pend(sem, BIOS_WAIT_FOREVER);
                System_printf("TaskCoreLED2 任务 计数值(之后):%d\n", Semaphore_getCount(sem));
                System_flush();

                // LED 闪烁
                unsigned char i;
                for(i = 0; i < 2; i++)
                {
                        GPIOPinWrite(SOC_GPIO_0_REGS, 110, GPIO_PIN_HIGH);
                        Delay(0x01FFFFFF);
                        GPIOPinWrite(SOC_GPIO_0_REGS, 110, GPIO_PIN_LOW);
                        Delay(0x01FFFFFF);
            
                        System_printf("TaskCoreLED2----LED2 twinkle count is :%d\n", i);
                        System_flush();
                }

                // 发布
                Semaphore_post(sem);
                System_printf("TaskCoreLED2----Semaphore_post\n");
                System_flush();

                // 休眠以允许低优先级任务执行
                Task_sleep(100);
        }
}

// 任务线程TaskCoreLED1,优先级为1
Void TaskCoreLED1(UArg a0, UArg a1)
{
        while(1)
        {
                if(Semaphore_getCount(sem) == 0)
                {
                        System_printf("TaskCoreLED1 任务被挂起\n");
                }

                System_printf("TaskCoreLED1 任务 计数值(之前):%d\n", Semaphore_getCount(sem));
                // 挂起
                Semaphore_pend(sem, BIOS_WAIT_FOREVER);
                System_printf("TaskCoreLED1 任务 计数值(之后):%d\n", Semaphore_getCount(sem));
                System_flush();

                // LED 闪烁
                unsigned char i;
                for(i = 0; i < 5; i++)
                {
                        GPIOPinWrite(SOC_GPIO_0_REGS, 110, GPIO_PIN_HIGH);
                        Delay(0x000FFFFF);
                        GPIOPinWrite(SOC_GPIO_0_REGS, 110, GPIO_PIN_LOW);
                        Delay(0x000FFFFF);
            
                        System_printf("TaskCoreLED1----LED1 twinkle count is :%d\n", i);
                        System_flush();
                }

                // 发布
                Semaphore_post(sem);
                System_printf("TaskCoreLED1----Semaphore_post\n");
                System_flush();
        }
}



回复

使用道具 举报

8

主题

21

帖子

1198

积分

金牌会员

Rank: 6Rank: 6

积分
1198
 楼主| 发表于 2021-9-2 11:00:08 | 显示全部楼层
以下是console打印的信息

[C674X_0]
TaskCoreLED2 任务 计数值(之前):1
TaskCoreLED2 任务 计数值(之后):0
TaskCoreLED2----LED2 twinkle count is :0
TaskCoreLED2----LED2 twinkle count is :1
TaskCoreLED2----Semaphore_post
TaskCoreLED1 任务 计数值(之前):1
TaskCoreLED1 任务 计数值(之后):0
TaskCoreLED1----LED1 twinkle count is :0
TaskCoreLED1----LED1 twinkle count is :1
TaskCoreLED2 任务被挂起------------------------------此时任务线程TaskCoreLED2 被挂起
TaskCoreLED2 任务 计数值(之前):0
TaskCoreLED1----LED1 twinkle count is :2
TaskCoreLED1----LED1 twinkle count is :3
TaskCoreLED1----LED1 twinkle count is :4
TaskCoreLED2 任务 计数值(之后):0----------------任务线程TaskCoreLED2 被挂起,这条语句怎么还会被执行?
TaskCoreLED2----LED2 twinkle count is :0----------任务线程TaskCoreLED2 被挂起,这条语句怎么还会被执行?
TaskCoreLED2----LED2 twinkle count is :1----------任务线程TaskCoreLED2 被挂起,这条语句怎么还会被执行?
TaskCoreLED2----Semaphore_post
TaskCoreLED1----Semaphore_post
TaskCoreLED1 任务 计数值(之前):1
TaskCoreLED1 任务 计数值(之后):0
TaskCoreLED1----LED1 twinkle count is :0
TaskCoreLED1----LED1 twinkle count is :1
TaskCoreLED2 任务被挂起------------------------------此时任务线程TaskCoreLED2 被挂起
TaskCoreLED2 任务 计数值(之前):0
TaskCoreLED1----LED1 twinkle count is :2
TaskCoreLED1----LED1 twinkle count is :3
TaskCoreLED1----LED1 twinkle count is :4
TaskCoreLED2 任务 计数值(之后):0----------------任务线程TaskCoreLED2 被挂起,这条语句怎么还会被执行?
TaskCoreLED2----LED2 twinkle count is :0----------任务线程TaskCoreLED2 被挂起,这条语句怎么还会被执行?
TaskCoreLED2----LED2 twinkle count is :1----------任务线程TaskCoreLED2 被挂起,这条语句怎么还会被执行?
TaskCoreLED2----Semaphore_post
TaskCoreLED1----Semaphore_post
。。。。。。
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2024-3-28 21:28 , Processed in 0.038243 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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