[RTT 루틴 연습] 2.3 신호량 - 감지 버튼(동기화) - (신호량 상호 배제)
간단하게 말하면, 라인은 일정 시간마다 버튼을 스캔한다.일단 유효한 키가 검출되면release 신호량으로 라인 2가 마운트에서 실행 상태로 들어가 직렬 포트에 키 정보를 출력합니다.
이렇게 해서 두 노선의 동기화를 실현하였다.
프로그램:
#include <rtthread.h>
#include "stm32f10x.h"
#define KEY_PORT GPIOB
#define KEY_PIN (GPIO_Pin_0 | GPIO_Pin_1)
#define KEY_CLOCK RCC_AHB1Periph_GPIOB
void rt_init_thread_entry(void *parameter)
{
GPIO_InitTypeDef GPIO_InitStructure;
// PB0
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
static rt_uint8_t thread1_stack[1024];
struct rt_thread thread1;
static int key;
static struct rt_semaphore sem;
static void rt_thread_entry1(void *parameter)
{
int temp;
while (1)
{
key = GPIO_ReadInputData(KEY_PORT);
if (key & KEY_PIN)
{
temp = key;
rt_thread_delay(RT_TICK_PER_SECOND / 50);
key = GPIO_ReadInputData(KEY_PORT);
if (key == temp);
rt_sem_release(&sem);
}
rt_thread_delay(RT_TICK_PER_SECOND / 10);
}
}
static rt_uint8_t thread2_stack[1024];
struct rt_thread thread2;
//static int key;
static void rt_thread_entry2(void *parameter)
{
while (1)
{
rt_sem_take(&sem, RT_WAITING_FOREVER);
if (key & KEY_PIN)
{
rt_kprintf("some keys has been pressed: %x
", key);
}
}
}
int rt_application_init()
{
rt_thread_t init_thread;
rt_err_t result;
result = rt_sem_init(&sem, "sem",
0, RT_IPC_FLAG_FIFO);
if (result != RT_EOK)
{
rt_kprintf("error, init sem failed!
");
return 0;
}
init_thread = rt_thread_create("init",
rt_init_thread_entry,
RT_NULL,
2048, 8, 20);
if (init_thread != RT_NULL)
rt_thread_startup(init_thread);
/* init thread1 */
rt_thread_init(&thread1,
"keyp", // producer
rt_thread_entry1,
RT_NULL,
&thread1_stack[0], sizeof(thread1_stack),
11, 25);
rt_thread_startup(&thread1);
rt_thread_init(&thread2,
"keyc", // consumer
rt_thread_entry2,
RT_NULL,
&thread2_stack[0], sizeof(thread2_stack),
11, 24);
rt_thread_startup(&thread2);
return 0;
}
결과는 다음과 같습니다.
some keys has been pressed : 40
some keys has been pressed : 80
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.