8장 - 예제1

조재훈·2023년 6월 20일

FreeRTOS 환경에서 모니터 만들기

  • FreeRTOS 환경 구축
  • OS Task 2개 만들기
  • USART3 수신부는 Interrupt 처리
  • Interrupt에서 받은 Rx Char를 Task1에서 Monitor Task 처리
  • Monitor Command는 Help, ls, rd 명령어 처리
  • Delete Key 처리
  • Monitor Command는 삽입 가능하도록 Structure 형태로 만들기

Pin Map

Code

main.h

#include <stdbool.h>

#define printf SMprintf
extern void SMprintf(const char *format, ...);
extern uint16_t Uart3_DeQueue(void);
extern bool Uart3_Is_Empty(void);
extern void Uart3_EnQueue(uint16_t data);
extern void onl_monitor(unsigned char c);

main.c

  • int main(void)
__HAL_UART_ENABLE_IT(&huart3, UART_IT_RXNE);
__HAL_UART_ENABLE_IT(&huart3, UART_IT_TC);

  • main.c
void UART_Interrupt_Processing(UART_HandleTypeDef *huart)
{
	if(huart->Instance == huart3.Instance)
	{
		if(HAL_UART_Receive_IT(&huart3, Receive_Buffer, 1) == HAL_OK)
		{
			RxFlag = 1;
			Uart3_EnQueue(Receive_Buffer[0]);
		}
	}
}

stm32f4xx_it.c

  • void USART3_IRQHandler(void)
void USART3_IRQHandler(void)
{
  HAL_UART_IRQHandler(&huart3);
  UART_Interrupt_Processing(&huart3);
}

callqueue.h

  • Core - Inc - callqueue.h
/*
 *  queue.h
 *
 *  Created on : 2023.06.20
 *  Author : Jaewhoon
 */
#ifndef QUEUE_H_
#define QUEUE_H_
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define U3_BUFFER_SIZE 100
#define TRUE 1
#define FALSE 0
void Uart3_EnQueue(uint16_t data);
void u3_increase_point_value(uint32_t * data_p);
uint16_t Uart3_DeQueue(void);
bool Uart3_Is_Empty(void);

#endif /* QUEUE_H_*/

callqueue.c

  • Core - Src - callqueue.c
#include "callqueue.h"

uint16_t u3_rx_buffer[U3_BUFFER_SIZE];
uint16_t u3_rx_point_head = 0;
uint16_t u3_rx_point_tail = 0;



void Uart3_EnQueue(uint16_t data)
{
	u3_rx_buffer[u3_rx_point_head] = data;
	u3_increase_point_value(&u3_rx_point_head);
}



void u3_increase_point_value(uint32_t *data_p)
{
	(*data_p)++;
	if(U3_BUFFER_SIZE == (*data_p))
	{
		(*data_p) = 0;
	}
}



uint16_t Uart3_DeQueue(void)
{
	uint16_t retVal = u3_rx_buffer[u3_rx_point_tail];
	u3_increase_point_value(&u3_rx_point_tail);
	return retVal;
}



bool Uart3_Is_Empty(void)
{
	if(u3_rx_point_head == u3_rx_point_tail)
	{
		return TRUE;
	}
	return FALSE;
}

callcmd.h

/*********************************************************
 * @file callcmd.h
 * #brief callcmd.c에서 사용하는 변수 및 함수정의
*********************************************************/

/*Define to prevent recursive inclusion******************/
#ifndef _CALLCMD_H
#define _CALLCMD_H

/*Includes***********************************************/

#include <stdio.h>
#include "string.h"
#include "stm32f4xx_hal.h"
#include "cmsis_os.h"
#include "FreeRTOS.h"
#include "task.h"
#include "cmsis_os.h"
#include <stdbool.h>

#define byte unsigned char
#define uint8 unsigned char
#define word unsigned short
#define lword unsigned int
#define int8u unsigned char
#define u8 unsigned char
#define u16 unsigned short
#define u32 unsigned int
#define DD_SUCCESS YES
#define FALSE -1
#define YES 1
#define NO 0
/* The Rx task will block on the Rx queue for a long period*/

#define COM1_DEBUG 0x00
#define printf SMprintf
uint16_t Uart3_DeQueue(void);
bool Uart3_Is_Empty(void);
extern UART_HandleTypeDef huart3; // access huart3 instance

#define COM1_DEBUG 0x00
#define printf SMprintf
uint16_t Uart3_DeQueue(void);
bool Uart3_Is_Empty(void);
extern UART_HandleTypeDef huart3; // access huart3 instance

void prt_hexbnb(int n, int8u *hex);
int8u ktolower(int8u c);
void cpybuf(int8u *src, int8u *des, int cnt);
int get_nstring(char buf[]);
char get_io_number(unsigned int *retval);
int dsp_mem(int argc, char *argv[]);
int chg_mem(int argc, char *argv[]);
int mem_read(int argc, char *argv[]);
int fill(int8u *sp, int8u c, int n);
int parse_string(unsigned char *s, char *argv[]);
int wrd_mon(int argc, char *argv[]);
int bfm_msg_mon(int argc, char *argv[]);
void onl_monitor(unsigned char c);
int monitor_chelp(int argc, char * argv[]);
int wl_mon(int argc, char *argv[]);
int wr_loop(int argc, char *argv[]);

#endif /*_COMMON_H*/

callcmd.c

빌드가 안되는데 정의가 안된 변수들이 있다고 한다.
원인을 좀 더 파악해보기로....

profile
맨땅에 헤딩. 인생은 실전.

0개의 댓글