기술나눔

마이크로컨트롤러 소프트웨어 아키텍처 직렬(5)-큐

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

앞에서 포인터, 구조 등의 기본 지식에 대해 이야기했습니다. 이 기사의 시작 부분에서는 대기열과 같은 기본 지식을 일부 복잡하게 적용해 보겠습니다.

실제로 2018년에는 대기열 형성에 대한 단계별 튜토리얼과 일련의 실용적인 고급 프로그래밍 사고 및 기술이 포함된 프로그램 아키텍처에 대한 일련의 비디오를 녹화했습니다. 친구. .

하지만 튜토리얼이 비교적 일찍 녹음되었기 때문에 음질이 상대적으로 좋지 않고 일부 세부 사항이 완벽하지 않습니다. 그러므로 이 가시는 항상 내 마음 속에 박혀 있었습니다. Wuji 마이크로컨트롤러 특별 훈련 캠프의 골수들이 우리 프로젝트를 보다 효율적이고 더 잘 배울 수 있도록 하기 위해 최근에는 이러한 기본 콘텐츠를 재구성하여 시리즈로 만들 계획입니다. 소프트웨어 아키텍처 2.0 그래픽/비디오 튜토리얼.

1. 왜 대기열에 대해 이야기해야 합니까?

저는 R&D 엔지니어로 근무하면서 산업용 제어보드, PDU, 사물인터넷 등 통신 제품을 자주 접했습니다.

일반적으로 이런 종류의 제품을 만들 때 직렬 통신이든 무선 통신이든 데이터 스트림을 작성하고 수신할 때 골치 아픈 문제가 됩니다.

예를 들어 STM32는 직렬 포트 데이터 스트림을 수신합니다.

초기에는 수신된 데이터 스트림을 처리하기 위해 배열과 배열 첨자 변수를 정의했습니다.

이 방법은 많은 문제를 안고 있으며 엔지니어가 코드를 작성하는 복잡성을 증가시킵니다.

  • 코드 유지 관리가 번거롭다

범위를 벗어난 오류를 방지하려면 배열 버퍼 경계를 수동으로 확인해야 하기 때문에 배열은 더 복잡한 데이터 스트림을 처리하거나 새 데이터 소스를 추가해야 할 때 대기열만큼 확장하고 유지 관리하기가 쉽지 않습니다.

  • 데이터는 혼동되기 쉽습니다.

ISR(인터럽트 서비스)에서 어레이를 직접 작동하면 기본 프로그램과 리소스 경쟁이 발생할 수 있습니다. 여러 작업이 동일한 어레이에 액세스하는 경우 데이터 경합 상태 및 불일치를 방지하기 위해 추가 동기화 메커니즘(예: 뮤텍스 잠금)이 필요합니다.

데이터 수신 및 처리가 동기화되지 않은 경우 어레이를 사용하면 데이터 순서 혼란이 발생하여 프로그램 문제로 인해 데이터 패킷 손실이 발생할 수 있습니다. 나는 이전에 이 문제로 윙윙거렸는데, 이 문제를 해결하려면 추가 코드가 필요하고, 이로 인해 프로그램이 더 복잡해지며, 모든 노력을 기울여도 그것을 만드는 것이 안정적이지 않습니다.

이런 종류의 문제는 오랫동안 저를 괴롭혔습니다. 나중에 직업을 바꾸고 다른 엔지니어가 작성한 코드를 읽고 나서야 대기열이 이러한 문제점을 해결할 수 있다는 것을 깨달았습니다. 그 이후로 데이터 흐름을 처리하는 방식은 다음과 같습니다.

훨씬 심플한 느낌이랄까? 실제로 큐의 데이터 처리 알고리즘은 간단하지 않습니다. 단지 큐를 사용하여 데이터 처리를 위한 일반적인 템플릿을 만들면 됩니다. 전문적인 용어로 말하면 바로 사용할 수 있습니다. 코드를 더 재사용할 수 있습니다.

이는 대기열의 응용 프로그램 중 하나일 뿐입니다. 데이터를 캐싱하고 대기열에서 빼내는 것은 선입선출 규칙을 따릅니다.

즉, 먼저 데이터를 저장한 다음 CPU에 여유 시간이 있거나 프로그램의 특정 조건이 충족될 때 처리를 위해 데이터를 꺼내는 것입니다.

이 특징을 바탕으로 많은 실용적인 응용이 도출될 수 있습니다. 특히 데이터 순서를 보장해야 하는 애플리케이션을 처리할 때 그렇습니다.

2. 어떤 시나리오에서 대기열을 사용해야 합니까?

제가 가장 많이 이용하는 곳을 몇 군데 정리해봤습니다.

2.1 직렬 통신 데이터 버퍼

마이크로 컨트롤러가 직렬 포트를 통해 데이터를 수신할 때 일반적으로 큐를 사용하여 수신된 바이트를 버퍼링하므로 기본 프로그램에서 처리되기 전에 데이터가 손실되지 않습니다.

2.2 오디오 처리

오디오 재생 또는 녹음 장치에서 대기열은 단계별 재생 또는 녹음을 구현하기 위해 오디오 샘플 데이터를 버퍼링하는 데 사용됩니다. 예: 예를 들어 Wuji 마이크로컨트롤러 특별 훈련 캠프의 프로젝트 6에서는 WiFi 및 4G 알람 호스트에 음성 안내 기능이 있습니다. 예를 들어 집 밖에서 무장 버튼을 누르면 "집에서 무장 해제"라는 음성이 나옵니다. 'arming at home' 음성이 재생되며, arming at home 버튼을 누르면 'arming at home' 음성이 재생됩니다.

이 두 버튼을 빠르게 누르면 음성이 완전히 재생될 수 있는지 확인하기 위해 먼저 키 이벤트를 큐 캐시에 넣어 음성이 순서대로 완전히 재생될 수 있습니다.

2.3 작업 예약 및 동기화

RTOS를 사용하는 시스템에서 대기열은 메시지 전달 및 작업 간 동기화에 사용되며 복잡한 작업 예약을 지원합니다.

2.4 키 입력 처리

키 이벤트를 감지한 후 먼저 대기열에 넣을 수 있으며, 너무 빠른 키 누름으로 인해 키 이벤트가 손실되는 것을 방지하기 위해 주 프로그램에서 이러한 이벤트를 처리할 수 있습니다. 이는 현재 프로젝트에서 사용됩니다.

2.5 ADC 데이터

우리가 수집한 ADC 데이터는 특정 처리 후에 대기열에 던져져 적절한 시간에 처리되거나 분석될 수도 있습니다.

2.6 펌웨어 업그레이드 데이터 흐름

펌웨어 업그레이드의 데이터 상호 작용은 상대적으로 크기 때문에 데이터 무결성을 보장하기 위해 대기열을 사용하는 데 매우 적합합니다. 이는 프로젝트에서도 사용됩니다. 6. 펌웨어 업그레이드 프로세스 중에 다운로드한 펌웨어 데이터 블록을 대기열에 넣을 수 있습니다. 플래시 메모리에 순차적으로 기록됩니다. 유사한 애플리케이션이 많이 있습니다. 전체적으로 대기열은 많은 어려운 문제를 해결했습니다.

3. 대기열 원리

큐는 FIFO(선입선출) 원칙을 따르는 선형 데이터 구조입니다. 즉, 큐에 가장 먼저 들어간 데이터가 가장 먼저 제거됩니다. 큐에서 데이터는 일반적으로 큐의 꼬리라고 하는 한쪽 끝에서 큐에 들어가고, 큐의 헤드라고 하는 다른 쪽 끝에서는 데이터가 큐에서 제거됩니다. 이 구조는 데이터를 순서대로 처리해야 하는 상황에 대기열을 매우 적합하게 만듭니다.

대기열은 양방향 파이프에 탁구공을 채우는 것으로 생각할 수 있습니다. 이 작업을 대기열에 넣기라고 합니다. 파이프의 오른쪽에서 탁구공을 꺼냅니다. 이 동작을 대기열 제거라고 합니다.

파이프 안의 탁구공은 대형으로 정렬됩니다. 먼저 들어간 탁구공이 먼저 나오는 것이 대기열의 선입선출 규칙입니다.

탁구공은 데이터에 비유됩니다. 파이프라인이 얼마나 많은 탁구공을 담을 수 있는지는 캐시가 얼마나 많은 데이터를 저장할 수 있는지를 의미합니다. 위 그림의 큐는 4개의 데이터를 저장할 수 있습니다. 이는 Buff[4]와 동일합니다.

큐의 프로그램 구현은 고정 크기 배열, 헤드 포인터 및 테일 포인터를 통해 이루어집니다. 배열은 데이터 저장을 담당합니다. 헤드 포인터는 큐에서 빼낼 때 데이터를 가져와야 하는 주소를 담당합니다. tail 포인터는 데이터가 큐에 들어갈 때 어떤 주소에 저장되어야 하는지를 담당합니다. 따라서 대기열에 넣기와 대기열에서 빼기 작업은 배열에서 데이터 선입선출 알고리즘을 재생하는 두 개의 포인터입니다.

4. 대기열 사용

엔지니어마다 대기열 코드를 다르게 구현합니다. 풍부한 프로젝트 경험이 없거나 이전에 대기열을 사용해 본 적이 없다면 대기열 알고리즘을 작성할 수 있어야 한다고 당황하지 마십시오.

저도 처음 시작할 때 다른 사람의 큐 프로그램을 직접 이식해 내 프로젝트에서 계속 사용했고, 여러 프로젝트에서 능숙하게 사용한 뒤 큐 알고리즘 구현에 대한 자세한 코드를 연구하고 직접 몇 번 작성했습니다.

그러므로 우리 특별수련원 여러분, 처음부터 직접 작성하지 마시고, 먼저 사용법을 익힌 후, 하나의 예에서 추론을 이끌어내고, 이를 다양한 시나리오와 프로젝트에 적용한 다음, 익숙해진 후에 직접 작성해 보세요. 이것은 매우 중요한 학습 순서입니다.

무한 마이크로 컨트롤러 프로젝트 특별 훈련 캠프의 대기열 프로그램을 예로 들면 총 4가지 기능이 있습니다.

대기열이 비어 있음(x)

큐 함수를 지우십시오. 큐를 사용하기 전에 큐를 지워야 합니다. 클리어 함수는 기본적으로 배열의 첫 번째 요소인 유효한 주소를 가리키도록 헤드 포인터와 테일 포인터를 만듭니다. 주소 예외가 발생합니다.

공식적인 매개변수 설명: x - 대기열 구조 변수입니다.

큐데이터인(x,y,z)

데이터 대기열에 넣기 기능은 하나 이상의 데이터 바이트를 지정된 대기열에 던지는 것입니다.

공식적인 매개변수 설명:

x - 대기열 구조 변수

y - 데이터 주소

z - 큐에 넣을 데이터의 양(바이트)입니다.

알아채다:

①.입력하는 데이터는 unsigned char형만 가능합니다.

② 큐가 가득 차고 데이터가 계속 큐에 있으면 첫 번째 데이터 위치부터 데이터를 덮어씁니다.

큐데이터아웃(x,y)

데이터 대기열 제거 기능은 지정된 대기열에서 1바이트의 데이터를 가져오는 것입니다.

공식적인 매개변수 설명: x - 큐 구조 변수 y - 꺼낸 데이터, 저장할 주소

참고: 대기열 제거 기능은 한 번에 1바이트의 데이터만 가져올 수 있습니다.

큐데이터 길이(x)

지정된 대기열의 모든 데이터를 지웁니다. 공식적인 매개변수 설명: x - 대기열 구조 변수

5. 영상 시연 대기열 사용법

다음 콘텐츠에는 편집하기 불편한 일부 코드 및 비디오 설명이 포함되어 있습니다. 더 나은 읽기 경험을 위해 저에게 연락하여 Feishu를 준비할 수 있습니다.


최근 많은 팬분들이 저에게 마이크로컨트롤러를 어떻게 배우느냐고 문의해 주셨습니다. 저는 10년간의 업계 경험을 바탕으로 한 달간 정성스럽게 '싱글 칩 마이크로컴퓨터'를 컴파일했습니다.

마이크로컨트롤러를 위한 최고의 학습 경로 + 마이크로컨트롤러를 위한 초급부터 고급 튜토리얼까지 + 툴킷" 모두 열렬한 팬과 무료로 공유됩니다! ! !

그 외에도 상자 밑바닥에 있는 것들을 눈물 흘리며 공유하고 있습니다.22가지 인기 오픈소스 프로젝트,포함하다소스 코드 + 회로도 + PCB + 문서, 당신을 보자빨리 마스터가 되세요

튜토리얼 패키지 및 자세한 학습 경로는 저를 참조하세요.아래는 이 글의 시작 부분

초보 수준부터 고급 마이크로 컨트롤러 해킹까지의 학습 경로(튜토리얼 + 도구 포함)

초보 수준부터 고급 마이크로 컨트롤러 해킹까지의 학습 경로(튜토리얼 + 도구 포함)

초보 수준부터 고급 마이크로 컨트롤러 해킹까지의 학습 경로(튜토리얼 + 도구 포함)