OpenEdv-开源电子网

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

二值信号量按键控制灯

[复制链接]

6

主题

33

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
364
金钱
364
注册时间
2018-3-14
在线时间
126 小时
发表于 2018-4-19 11:58:10 | 显示全部楼层 |阅读模式
1金钱
二值信号量按键控制灯,不能实现,单独执行一个灯的任务和按键的任务都可以,不知道问题在哪,求助。新手

main.rar

998 Bytes, 下载次数: 33

最佳答案

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

既然是基于网上的L4工程修改,那么这段代码你看过和原子F4的例程是否一致(中断分组4,心跳时钟1ms...等设置),下面代码是原子F4例程 HAL_StatusTypeDef HAL_Init(void) { /* Configure Flash prefetch, Instruction cache, Data cache */ #if (INSTRUCTION_CACHE_ENABLE != 0) __HAL_FLASH_INSTRUCTION_CACHE_ENABLE(); #endif /* INSTRUCTION_CACHE_ENABLE */ #if (DATA_CACHE_ENABLE != 0) __HAL_FLASH_D ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

22

主题

203

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
378
金钱
378
注册时间
2017-11-29
在线时间
135 小时
发表于 2018-4-19 11:58:11 | 显示全部楼层
Jooker 发表于 2018-4-19 15:29
按键和灯都是在单独的.c和.h文件里,整个任务都在主函数里,移植的内容主要是主函数这部分,只不过f4是在 ...

既然是基于网上的L4工程修改,那么这段代码你看过和原子F4的例程是否一致(中断分组4,心跳时钟1ms...等设置),下面代码是原子F4例程
HAL_StatusTypeDef HAL_Init(void)
{
  /* Configure Flash prefetch, Instruction cache, Data cache */
#if (INSTRUCTION_CACHE_ENABLE != 0)
   __HAL_FLASH_INSTRUCTION_CACHE_ENABLE();
#endif /* INSTRUCTION_CACHE_ENABLE */

#if (DATA_CACHE_ENABLE != 0)
   __HAL_FLASH_DATA_CACHE_ENABLE();
#endif /* DATA_CACHE_ENABLE */

#if (PREFETCH_ENABLE != 0)
  __HAL_FLASH_PREFETCH_BUFFER_ENABLE();
#endif /* PREFETCH_ENABLE */

  /* Set Interrupt Group Priority */
  HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);//中断优先级分组4

  /* Use systick as time base source and configure 1ms tick (default clock after Reset is HSI) */
  HAL_InitTick(TICK_INT_PRIORITY);
  
  /* Init the low level hardware */
  HAL_MspInit();
  
  /* Return function status */
  return HAL_OK;
}


另外FreeRTOS.h和FreeRTOSConfig.h请替换成原子F4的
回复

使用道具 举报

6

主题

33

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
364
金钱
364
注册时间
2018-3-14
在线时间
126 小时
 楼主| 发表于 2018-4-19 12:00:48 | 显示全部楼层
#include "stm32l4xx.h"
#include "delay.h"
#include "led.h"
#include "key.h"
#include "FreeRTOS.h"
#include "task.h"
#include "semphr.h"

#define u8 unsigned char
#define START_TASK_PRIO                1       
#define START_STK_SIZE                 256  
TaskHandle_t StartTask_Handler;
void start_task(void *pvParameters);

#define KEY_TASK_PRIO                2       
#define KEY_STK_SIZE                 256  
TaskHandle_t KEYTask_Handler;
void KEY_task(void *pvParameters);

#define LED_TASK_PRIO 3       
#define LED_STK_SIZE  256
TaskHandle_t LED_Handler;
void LED_task(void *pvParameters);

SemaphoreHandle_t BinarySemaphore;        //二值信号量句柄

int main(void)
{
        HAL_Init();
        delay_Init();                                        //初始化延时函数
        LED_Init();                                                //初始化LED端口
        KEY_Init();

        //创建开始任务
    xTaskCreate((TaskFunction_t )start_task,            //任务函数
                (const char*    )"start_task",          //任务名称
                (uint16_t       )START_STK_SIZE,        //任务堆栈大小
                (void*          )NULL,                  //传递给任务函数的参数
                (UBaseType_t    )START_TASK_PRIO,       //任务优先级
                (TaskHandle_t*  )&StartTask_Handler);   //任务句柄              
    vTaskStartScheduler();          //开启任务调度
}

//开始任务任务函数
void start_task(void *pvParameters)
{
    taskENTER_CRITICAL();           //进入临界区
   
        BinarySemaphore=xSemaphoreCreateBinary();        //创建二值信号量
       
        //创建KEY_task任务                       
    xTaskCreate((TaskFunction_t )KEY_task,            
                (const char*    )"KEY_task",           
                (uint16_t       )START_STK_SIZE,        
                (void*          )NULL,                  
                (UBaseType_t    )KEY_TASK_PRIO,        
                (TaskHandle_t*  )&KEYTask_Handler);
       
    //创建LED_task任务
    xTaskCreate((TaskFunction_t )LED_task,     
                (const char*    )"LED_task",   
                (uint16_t       )LED_STK_SIZE,
                (void*          )NULL,
                (UBaseType_t    )LED_TASK_PRIO,
                (TaskHandle_t*  )&LED_Handler);
                       
        vTaskDelete(StartTask_Handler); //删除开始任务
    taskEXIT_CRITICAL();            //退出临界区
}

//KEY_task函数
void KEY_task(void *pvParameters)
{
        while(1)
        {
                static unsigned char key_old=1;
                if(KEY==0&&key_old==1)       
                        xSemaphoreGive(BinarySemaphore);
                key_old=KEY;
                //vTaskDelay(10);
                delay_ms(10);
        }
}

//LED_task函数
void LED_task(void *pvParameters)
{
        while(1)
        {
                xSemaphoreTake( BinarySemaphore, portMAX_DELAY );
                HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_1);
        }
}
回复

使用道具 举报

22

主题

203

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
378
金钱
378
注册时间
2017-11-29
在线时间
135 小时
发表于 2018-4-19 14:01:06 | 显示全部楼层
能发我邮箱吗?我下载不了  我的电脑的问题。
回复

使用道具 举报

22

主题

203

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
378
金钱
378
注册时间
2017-11-29
在线时间
135 小时
发表于 2018-4-19 14:20:07 | 显示全部楼层
if(KEY==0&&key_old==1)       
                        xSemaphoreGive(BinarySemaphore);
                key_old=KEY;

------------------
信号量没有发送出去,这段处理有问题。
回复

使用道具 举报

6

主题

33

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
364
金钱
364
注册时间
2018-3-14
在线时间
126 小时
 楼主| 发表于 2018-4-19 14:50:00 | 显示全部楼层
wen619 发表于 2018-4-19 14:20
if(KEY==0&&key_old==1)       
                        xSemaphoreGive(BinarySemaphore);
                key_old=KEY;

刚才我用这个代码在f4的开发板上测试时能用的,这块应该没问题吧。现在要用l4的,移植到里面就不行了
回复

使用道具 举报

22

主题

203

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
378
金钱
378
注册时间
2017-11-29
在线时间
135 小时
发表于 2018-4-19 15:08:10 | 显示全部楼层
本帖最后由 wen619 于 2018-4-19 15:32 编辑

KEY这个变量  在哪里定义的?在主函数里 我没有看到定义呢?
另外从F4移植到L4的过程中,做了什么移植的操作?--------------------------------------------------------------------------------
加几句判断是否成功发送二值信号量的代码  串口里看看?
//KEY_task函数
void KEY_task(void *pvParameters)
{   u8 err=0;
        while(1)
        {
                static unsigned char key_old=1;
                if(KEY==0&&key_old==1)        
                 err= xSemaphoreGive(BinarySemaphore);
                if(err==pdTRUE)
                 {printf(“success send\r\n”);}
                else
                 {printf(“failed send\r\n”);}
                key_old=KEY;
                //vTaskDelay(10);
                delay_ms(10);
        }
}
回复

使用道具 举报

6

主题

33

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
364
金钱
364
注册时间
2018-3-14
在线时间
126 小时
 楼主| 发表于 2018-4-19 15:29:38 | 显示全部楼层
wen619 发表于 2018-4-19 15:08
KEY这个变量  在哪里定义的?在主函数里 我没有看到定义呢?
另外从F4移植到L4的过程中,做了什么移植的操 ...

按键和灯都是在单独的.c和.h文件里,整个任务都在主函数里,移植的内容主要是主函数这部分,只不过f4是在正点原子的freertos例程基础上修改的,l4没有例程,是从网上找的工程,在这个基础上修改的,测试的时候任务都可以正常执行。
回复

使用道具 举报

6

主题

33

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
364
金钱
364
注册时间
2018-3-14
在线时间
126 小时
 楼主| 发表于 2018-4-20 13:30:35 | 显示全部楼层
wen619 发表于 2018-4-19 15:41
既然是基于网上的L4工程修改,那么这段代码你看过和原子F4的例程是否一致(中断分组4,心跳时钟1ms...等 ...

试了下,还是不行,我再自己重新移植下吧,多谢帮助了
回复

使用道具 举报

6

主题

33

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
364
金钱
364
注册时间
2018-3-14
在线时间
126 小时
 楼主| 发表于 2018-4-20 15:03:28 | 显示全部楼层
wen619 发表于 2018-4-19 15:41
既然是基于网上的L4工程修改,那么这段代码你看过和原子F4的例程是否一致(中断分组4,心跳时钟1ms...等 ...

解决了,把两个任务拆分出来,没用start任务,不过还是多谢帮助啦
回复

使用道具 举报

22

主题

203

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
378
金钱
378
注册时间
2017-11-29
在线时间
135 小时
发表于 2018-4-20 15:38:33 | 显示全部楼层
Jooker 发表于 2018-4-20 15:03
解决了,把两个任务拆分出来,没用start任务,不过还是多谢帮助啦

分析过什么原因吗? 是不是堆栈空间不够了。之前有三个任务每个任务都是256的大小三个加起来就是256*3*4byte, 内存池够吗?你这个L4的芯片?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-25 23:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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