Embedded Engineer (92) 썸네일형 리스트형 Stack - 중위표기법 (괄호 x) Stack을 활용해 중위계산법을 구현해보자 중위계산법은 그냥 우리가 생각하는 일반적인 방법이다. 검증 할 식 ex) 10 * 5 - 8 / 4 + 2 * 3 계산을 하기 위해 Stack에 쌓아보자 여기서 구현 할때 String문자를 10진수 변환 하기 위해 strtoul 함수를 사용했다 strtoul을 사용하여 10진수를 바꿔보면 + 부호 - 부호는 같이 묶여서 나타난다. 즉 부호는 * / 만 존재한다. 다음 식을 Stack에 담아 보자 ex) 10 + 9 * 5 * -2 / 1 + 2 * 3 식을 계산 할려면 왼쪽에서 오른쪽으로 읽어가면서 곱셈, 나눗셈이 있는지 확인 해야 하는데 Stack Pointer는 반대 쪽에 위치하고 있다 옮겨 주자 끝까지 옮기면 다음과 같은 그림이 완성 된다. 그림 같이 함수.. STACK 구현 스택은 예전에 Assembly 공부하면서 Study 함 참조 링크: kjt9109.tistory.com/entry/5%EC%9E%A5%ED%94%84%EB%A1%9C%EC%8B%9C%EC%A0%80?category=825870 바로 소스로 들어가자 STACK API #define STACK_SIZE 50 typedef int Data; typedef struct __Stack { int buf[STACK_SIZE]; int stack_ptr; } Stack; void StackInit(Stack *pstack); void Show_Stack(Stack *pstack); void SPush(Stack *pstack, Data data); int sIsEmpty(Stack *pstack); Data SPop.. 연결리스트 #2 리스트 추가기능 연결리스트 #1에서 구현한 리스트에서 추가하고 싶은 위치에 리스트를 추가해보자. 예시 리스트에서 내가 원하는 index에 추가를 하고자 할려면 각 리스트 구조체마다 index number가 필요하다 따라서 다음과 같이 구조체에 index_num을 추가한다. typedef struct __LinkedList { char data[50]; int index_num; struct __LinkedList *next; }LinkedList; 또한 기존에 List를 Malloc으로 생성 후 RecvData를 저장 했던 작업에서 index_num역시 추가해준다. { BODY = (LinkedList*) malloc(sizeof(LinkedList)); strcpy(BODY->data, RecvData); BODY->.. 연결 리스트 #1 구현 연결리스트를 구현해보자 연결리스트를 그림으로 그리면 다음과 같다. 이런 느낌인데 실제 코드를 구현하기 위해 다음과 같이 보충 후 코딩하였다. TAIL에 들어가는 조건은 String으로 입력이 Finish로 들어왔을 시 TAIL에 저장이 되고 HEAD는 첫 데이터 입력시에만 저장된다. LinkedList의 구조체는 다음과 같다. typedef struct __LinkedList { char data[50]; struct __LinkedList *next; }LinkedList; data버퍼는 String 값을 저장하고 Next는 다음 LinkedList의 구조체를 나타낸다. LinkedList를 만들기 위해 HEAD, BODY, TAIL이 필요하고 각각 HEAD, BODY, TAIL을 연결해주기 위한 Li.. STM32 SPI ErrorCallback 처리 SPI Slave 동작 중에 가끔 HAL_SPI_ErrorCallback으로 진입하고 SPI는 멈추는 현상이 있다. 먼저 개발 스펙은 다음과 같다. Develop Toolchain Toolchain / IDE: STM32CubeIDE Firmware Package Name and Version: STM32Cube FW_L1 V1.10.0 SPI Settings Mode: FULL-Duplex Slave Basic Parameters: Frame Format Motorola Data Size 8 Bits First Bit MSB First Clock Parameters: Frequency 1MHz Clock Polarity (CPOL) Low Clock Phase (CPHA) 2 Edge * CRC Cal.. STM32 SPI Slave 동작 시 데이터 송수신 이상 현상 SPI Slave 동작 중 데이터를 receive 받을 때 받는 텀이 매우 빠르면 데이터가 밀리거나 동작이 안되는 현상이 있다. 개발 스펙은 다음과 같다. Develop Toolchain Toolchain / IDE: STM32CubeIDE Firmware Package Name and Version: STM32Cube FW_L1 V1.10.0 SPI Settings Mode: FULL-Duplex Slave Basic Parameters: Frame Format Motorola Data Size 8 Bits First Bit MSB First Clock Parameters: Frequency 1MHz Clock Polarity (CPOL) Low Clock Phase (CPHA) 2 Edge * CRC.. 배열 리스트 리스트의 의미는 다음과 같다 순차 리스트 : 배열을 기반으로 구현된 리스트 연결 리스트 : 메모리의 동적 할당을 기반으로 구현된 리스트 배열리스트를 구현해보자 책(윤성우의 열혈 자료구조)에서 제공하는 배열 리스트의 자료구조 ADT는 다음과 같다. Operations: void ListInit(List * plist); - 초기화할 리스트의 주소 값을 인자로 전달한다. - 리스트 생성 후 제일먼저 호출되어야하는 함수이다. void LInsert(List * plist , LData data); - 첫 번째 데이터가 pdata 가 가리키는 메모리에 저장된다. - 데이터의 참조를 위한 초기화가 진행된다. - 참조 성공시 TRUE(1), 실패 시 FALSE(0) 반환 void LNext(List * plist,.. 재귀알고리즘(하노이타워) 하노이 타워를 재귀함수를 통해 구현 해보자. 하노이타워의 조건은 다음과 같다. 1. 원반은 한번에 하나씩만 옮길 수 있다. 2. 옮기는 과정에서 작은 원반의 위에 큰 원반이 올려져서는 안된다. 위 그림 ABC 원반을 3번 기둥으로 옮기기 위해서는 다음과 같은 패턴이 들어간다. C를 옮기기 위해서는 B를 옮겨야 한다. B를 옮기기 위해서는 A를 옮겨야 한다. A는 옮기면 된다. ~를 옮겨야 한다. 여기서 원반 갯수가 늘어나도 ~~를 옮겨야 한다는 건 달라지지 않는다. 좀 더 보강해서 5개의 원반이 있다고 하자 (A, B, C, D, E) ABCDE를 3번 기둥에 옮기기 위해서는 (A,B,C,D)를 2번기둥에 옮겨야 한다. E를 옮긴 후 ABCD를 3번 기둥에 옮긴다. ABCD를 3번 기둥에 옮기기 위해서는.. 이전 1 ··· 3 4 5 6 7 8 9 ··· 12 다음