//sem.c
#include <rtthread.h>
#include <rtdevice.h>
#include "drv_gpio.h"
#define THREAD_PRIORITY 25
#define THREAD_TIMESLICE 5
#define LED3_PIN GET_PIN(B, 3)
ALIGN(RT_ALIGN_SIZE)
static char thread3_stack[1024];
static struct rt_thread thread3;
static struct rt_semaphore keyPress1_sem;
void KeyScanCallBack(void)
{
rt_sem_release(&keyPress1_sem);
}
static void rt_thread3_entry(void *parameter)
{
static rt_err_t result;
// static int cnt = 0;
while(1)
{
/* 永 久 方 式 等 待 信 号 量, 获 取 到 信 号 量, 则 执 行 number 自 加 的 操 作 */
result = rt_sem_take(&keyPress1_sem, RT_WAITING_FOREVER);
if (result != RT_EOK)
{
rt_kprintf("t3 take a static semaphore, failed.\n");
return;
}
else
{
rt_kprintf("t3 take a static semaphore");
rt_pin_write(LED3_PIN, PIN_HIGH);
rt_thread_mdelay(1000);
rt_pin_write(LED3_PIN, PIN_LOW);
// if(++cnt >= 5)
// {
// rt_sem_detach(&keyPress1_sem);
// return;
// }
}
}
}
void Key1PressTaskInit(void)
{
/* 初 始 化 3 个 信 号 量 */
rt_sem_init(&keyPress1_sem, "keyPress1_sem", 0, RT_IPC_FLAG_FIFO);
rt_pin_mode(LED3_PIN, PIN_MODE_OUTPUT);
rt_thread_init(&thread3,
"thread3",
rt_thread3_entry,
RT_NULL,
&thread3_stack[0],
sizeof(thread3_stack),
THREAD_PRIORITY-1, THREAD_TIMESLICE);
rt_thread_startup(&thread3);
}
//usrtimer.c
#include <rtthread.h>
#include <rtdevice.h>
#include "drv_gpio.h"
/* 定时器的控制块 */
static struct rt_timer timer3;
static int cnt = 0;
#define KEY1_PIN GET_PIN(C, 5)
static uint8_t keyVal = 0;
void KeyScanCallBack(void);
static void keyscan(void* parameter)
{
static uint8_t i = 0;
uint8_t val;
val = rt_pin_read(KEY1_PIN);
if(val == 0)
{
if(i < 200)
{
i ++;
}
}
else
{
if(i >= 2)
{
keyVal = 1;
rt_kprintf("key press val is %d\n",keyVal);
KeyScanCallBack();
keyVal = 0;
}
i = 0;
}
}
void keyscan_init(void)
{
rt_pin_mode(KEY1_PIN, PIN_MODE_INPUT);
rt_timer_init(&timer3,
"timerKeyscan", /* 定时器名字是 timer2 */
keyscan, /* 超时时回调的处理函数 */
RT_NULL, /* 超时函数的入口参数 */
5, /* 定时长度为 5 个 OS Tick */
RT_TIMER_FLAG_PERIODIC); /* 单次定时器 */
rt_timer_start(&timer3);
}
//main.c
#include <rthw.h>
#include <stdio.h>
#include <rtthread.h>
#include <rtdevice.h>
#include "drv_gpio.h"
#include "gd32f3x0.h"
/* defined the LED2 pin: PC6 */
#define LED1_PIN GET_PIN(B, 1)
#define LED2_PIN GET_PIN(B, 2)
#define delay_ms(x) rt_thread_mdelay(x)
#define RT_USR1_THREAD_PRIO 6
#define USR1_THREAD_NAME "usr1"
static struct rt_thread usr1_thread;
static rt_uint8_t usr1_thread_stack[500];
void rt_thread_usr1_entry(void *parameter)
{
/* set LED2 pin mode to output */
rt_pin_mode(LED2_PIN, PIN_MODE_OUTPUT);
while (1)
{
rt_pin_write(LED2_PIN, PIN_HIGH);
rt_thread_mdelay(2000);
rt_pin_write(LED2_PIN, PIN_LOW);
rt_thread_mdelay(3000);
}
}
void keyscan_init(void);
void Key1PressTaskInit(void);
int main(void)
{
keyscan_init();
Key1PressTaskInit();
rt_thread_init(&usr1_thread,
USR1_THREAD_NAME,
rt_thread_usr1_entry,
RT_NULL,
&usr1_thread_stack[0],
sizeof(usr1_thread_stack),
RT_USR1_THREAD_PRIO,
20);
rt_thread_startup(&usr1_thread);
/* set LED1 pin mode to output */
rt_pin_mode(LED1_PIN, PIN_MODE_OUTPUT);
while (1)
{
rt_pin_write(LED1_PIN, PIN_HIGH);
rt_thread_mdelay(500);
rt_pin_write(LED1_PIN, PIN_LOW);
rt_thread_mdelay(600);
}
}
按键一次,rt_sem_release(&keyPress1_sem);执行一次信号量值value加1。按键可以很快,但rt_thread3_entry()执行以下需要1s多。
rt_kprintf("t3 take a static semaphore");
rt_pin_write(LED3_PIN, PIN_HIGH);
rt_thread_mdelay(1000);
rt_pin_write(LED3_PIN, PIN_LOW);
即生产过快,消耗过慢。