블로그 이미지
안녕1999

카테고리

전체 (3067)
자바스크립트 (20)
안드로이드 (14)
WebGL (4)
변비 (17)
정치,경제 (35)
C언어,ARM (162)
컴퓨터(PC, Note Book, 윈.. (41)
전자회로, PCB (27)
유머,안웃긴,GIF,동영상 (118)
국부론60 (71)
모듈(PCB) (3)
건강 (2)
FreeCAD (25)
PADS (43)
퇴직,퇴사,구직,취업 활동 (3)
C# (86)
엑셀 (8)
워드 (0)
LabView (6)
레고 (30)
FPGA (0)
Total
Today
Yesterday

달력

« » 2024.12
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

공지사항

최근에 올라온 글

MSVCP60D.DLL

C언어,ARM / 2020. 8. 29. 23:11

MSVCP60D.zip
0.12MB

'C언어,ARM' 카테고리의 다른 글

LINK : fatal error LNK1104: cannot open file "nafxcwd.lib"  (0) 2020.08.29
GPIB  (0) 2020.08.29
VC++ 6.0 pragma comment lib 링커에러  (0) 2020.08.29
stm32 - USART3->BRR  (0) 2020.08.22
stm32-Invalid ROM Table  (0) 2020.08.15
Posted by 안녕1999
, |
#pragma comment(lib, "..\\xxx32.lib")
와 같이 lib파일을 지정해주면, 링크에러가 발생한다.
해결방법 : 프로젝트 설정에서 링크 디렉토리를 추가해준다.

'C언어,ARM' 카테고리의 다른 글

GPIB  (0) 2020.08.29
MSVCP60D.DLL  (0) 2020.08.29
stm32 - USART3->BRR  (0) 2020.08.22
stm32-Invalid ROM Table  (0) 2020.08.15
stm32 keill컴파일러  (0) 2020.08.15
Posted by 안녕1999
, |

stm32 - USART3->BRR

C언어,ARM / 2020. 8. 22. 23:50

동일한 장비에 동일한 코드인데도, USART3 통신이 되는것이 있고, 안되는것이 있다.
증상) 10바이트 보내면, 9,10,8,,10,10,10바이트등으로 전송된다.
원인1) UART통신과 아무 관련 없는 코드가 통신에 영향을 준다.
          해당코드를 제거하니, 정상동작함.(최적화와는 상관없는듯.)
          keill은 최적화 안함으로 설정하는 방법이 없는듯 하다. 최적화 정도도 매번 다르다.
원인2) USART3->BRR=50000000/Baud_rate;//434이고, 통신 데이터가 다 깨진다.
         통신이 잘안되는 이코드에 USART3->BRR=477을 넣으면 잘된다.

Baud계산이 잘못될 수 있다는 내용의 글들이 인터넷에 있다.
(찾았는데, 잊어버렸다.. 직접 찾아봐라.)


그래서, 이문제를 간단하게 해결할 수 있는 방법으로,
기존코드가 계산한 값 -@ ~ +@까지 직접 통신데이터를 출력해보고,
정상적으로 전송되는 BAUD값을 사용하기로 했다.
BAUD값이 1차이가 난다고, 통신이 아예 안되는건 아니다.
a~b까지는 거의 정상적으로 통신을 할 수 있다.
(a+b)/2값이 가장 통신이 잘되는 값일듯 하나, 직접해보니, 또 그렇지도 않은듯 하다.(통신은 잘 된다)

요약 : Baud값을 변경하면서, 통신이 잘되는 범위 측정하여 평균값 사용.

(stm32 사용하면서 별 드러운 버그 몇개 만나보면, .... 버그 없는 칩은 없겠지만...)

 

#include <UART.h>
#include "stm32f7xx_hal.h"
#include "..\src\FIFO.h"
#include "..\src\cpu.h"


void UART_ER_Control(USART_TypeDef* Serial_USART)
{
	uint32_t ERROR_Code = Serial_USART->ISR;
	
	if((ERROR_Code & USART_ISR_PE)==USART_ISR_PE)
	{
		Serial_USART->ICR = USART_ICR_PECF;
		Serial_USART->CR1 &= ~0x01;
		Serial_USART->CR1 |= 0x01;
		//NVIC_SystemReset();
	}
	else if((ERROR_Code & USART_ISR_FE)==USART_ISR_FE)
	{
		Serial_USART->ICR = USART_ICR_FECF;
		Serial_USART->CR1 &= ~0x01;
		Serial_USART->CR1 |= 0x01;
		//NVIC_SystemReset();
		//HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_SET);
	}
	else if((ERROR_Code & USART_ISR_NE)==USART_ISR_NE)
	{
		Serial_USART->ICR = USART_ICR_NCF;
		Serial_USART->CR1 &= ~0x01;
		Serial_USART->CR1 |= 0x01;
		//NVIC_SystemReset();
		//HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_SET);
	}
	else if((ERROR_Code & USART_ISR_ORE)==USART_ISR_ORE)
	{
		Serial_USART->RQR =	USART_RQR_RXFRQ;
		Serial_USART->ICR = USART_ICR_ORECF;
		Serial_USART->CR1 &= ~0x01;
		Serial_USART->CR1 |= 0x01;
		//NVIC_SystemReset();
	}
}
#ifndef UART3_TX_WAIT
	#define UART3_TX_WAIT()	while((USART3->ISR & USART_ISR_TXE)==0);
#endif


#define UART1_RX_BUF_SIZE	(512)
#define UART1_TX_BUF_SIZE	(1024)

#define UART2_RX_BUF_SIZE	(512)
#define UART2_TX_BUF_SIZE	(1024)

#define UART3_RX_BUF_SIZE	(512)
#define UART3_TX_BUF_SIZE	(1024)

volatile sFIFO UART1_rx_fifo,UART1_tx_fifo;
byte1 UART1_rx_fifo_buf[UART1_RX_BUF_SIZE],UART1_tx_fifo_buf[UART1_TX_BUF_SIZE];

volatile sFIFO UART2_rx_fifo,UART2_tx_fifo;
byte1 UART2_rx_fifo_buf[UART2_RX_BUF_SIZE],UART2_tx_fifo_buf[UART2_TX_BUF_SIZE];

volatile sFIFO UART3_rx_fifo,UART3_tx_fifo;
byte1 UART3_rx_fifo_buf[UART3_RX_BUF_SIZE],UART3_tx_fifo_buf[UART3_TX_BUF_SIZE];
#define USART3_SET_BRR()	USART3->BRR=477
void UART3_init(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;
	USART_TypeDef* Serial_USART=USART3;
	uint32_t Baud_rate=115200;
	
	sFIFO_init(&UART3_rx_fifo,UART3_rx_fifo_buf,sizeof(UART3_rx_fifo_buf));
	sFIFO_init(&UART3_tx_fifo,UART3_tx_fifo_buf,sizeof(UART3_tx_fifo_buf));
	
	//GPIO Ports Clock Enable
	__HAL_RCC_GPIOD_CLK_ENABLE();
	__HAL_RCC_USART3_CLK_ENABLE();
	
	//UART3
	GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9;
	GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
	GPIO_InitStruct.Pull = GPIO_PULLUP;
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
	GPIO_InitStruct.Alternate = GPIO_AF7_USART3;
	HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
	
	
	//Serial_FPGA default setting	
	Serial_USART->CR1 = 0x2d;		// Interrupt Setting and Usart operation 
	Serial_USART->CR2 = 0x00;
	Serial_USART->CR3 = 0x01;
	
	//Serial_USART->BRR = 50000000/Baud_rate;	//434(Clock/BRR)
	USART3_SET_BRR();
	HAL_NVIC_EnableIRQ(USART3_IRQn);//interrupt 설정 
	
	//DEBUG while(1)
	USART3->TDR=0;
}
void UART_init(USART_TypeDef* Serial_USART,uint32_t Baud_rate)
{	
	Serial_USART->CR1 = 0x2d;							// Interrupt Setting and Usart operation 
	Serial_USART->CR2 = 0x00;
	Serial_USART->CR3 = 0x01;
	if(Serial_USART == USART1)
	{
		sFIFO_init(&UART1_rx_fifo,UART1_rx_fifo_buf,sizeof(UART1_rx_fifo_buf));
		sFIFO_init(&UART1_tx_fifo,UART1_tx_fifo_buf,sizeof(UART1_tx_fifo_buf));
		
		RCC->DCKCFGR2 &=0xFFFFFFFC; 										//USART1 in sys clock 		
		RCC->DCKCFGR2 |=0x00000001; 										//USART1 in sys clock 		
		
		Serial_USART->BRR = 200000000/Baud_rate;
		
		HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
		HAL_NVIC_EnableIRQ(USART1_IRQn);
	}
	else if(Serial_USART == USART2)
	{
		sFIFO_init(&UART2_rx_fifo,UART2_rx_fifo_buf,sizeof(UART2_rx_fifo_buf));
		sFIFO_init(&UART2_tx_fifo,UART2_tx_fifo_buf,sizeof(UART2_tx_fifo_buf));
		Serial_USART->BRR = 50000000/Baud_rate;											//(Clock/BRR)
		HAL_NVIC_EnableIRQ(USART2_IRQn);
	}
	else if(Serial_USART == USART3)
	{
		sFIFO_init(&UART3_rx_fifo,UART3_rx_fifo_buf,sizeof(UART3_rx_fifo_buf));
		sFIFO_init(&UART3_tx_fifo,UART3_tx_fifo_buf,sizeof(UART3_tx_fifo_buf));
		//Serial_USART->BRR = 50000000/Baud_rate;	//434										//(Clock/BRR)
		USART3_SET_BRR();
		HAL_NVIC_EnableIRQ(USART3_IRQn);														//interrupt 설정 
	}
	else
	{
	}
}


void UART3_putch(char a);
void UART1_putch(char a)
{
	//UART3_putch(a);
	
	/*USART1->CR1|=USART_CR1_TCIE;
	USART1->TDR=a;
	while ((USART1->ISR & USART_CR1_TCIE)==0);
	USART1->CR1&=~USART_CR1_TCIE;*/
	
	USART1->CR1 &= ~USART_CR1_TCIE;//전송중단
	sFIFO_push(&UART1_tx_fifo,a);
	USART1->CR1|=USART_CR1_TCIE;
}
void UART3_putch(char a)
{
	/*USART3->CR1|=USART_CR1_TCIE;
	USART3->TDR=a;
	while ((USART3->ISR & USART_CR1_TCIE)==0);
	USART3->CR1&=~USART_CR1_TCIE;*/
	
	//USART3->CR1&=~USART_CR1_TCIE;//인터럽트 금지
	USART3->CR1 &= ~USART_CR1_TCIE;//전송중단
	sFIFO_push(&UART3_tx_fifo,a);
	USART3->CR1|=USART_CR1_TCIE;
}
void UART1_write(void *pdata,int len)
{
	while(sFIFO_EmptyCount(&UART1_tx_fifo)<len)
	{
		Sleep(1);
	}
	USART1->CR1 &= ~USART_CR1_TCIE;//전송중단
	sFIFO_write(&UART1_tx_fifo,pdata,len);
	USART1->CR1|=USART_CR1_TCIE;
}
void UART3_write(void *pdata,int len)
{
	/*byte1 *p=(byte1 *)pdata;
	while(len)
	{
		UART3_putch(*p);
		p++;
		len--;
	}*/
	while(sFIFO_EmptyCount(&UART3_tx_fifo)<len)
	//while(sFIFO_Count(&UART3_tx_fifo)>0)
	{
		USART3->CR1|=USART_CR1_TCIE;
		Sleep(1);
	}
	USART3->CR1 &= ~USART_CR1_TCIE;//전송중단
	sFIFO_write(&UART3_tx_fifo,pdata,len);
	USART3->CR1|=USART_CR1_TCIE;
}
void UART1_tx_end_wait(void)
{
	while(UART1_tx_fifo.cnt>0)
	{
		Sleep(1);
	}
}
void UART3_tx_end_wait(void)
{
	while(UART3_tx_fifo.cnt>0)
	{
		Sleep(1);
	}
}
#include "string.h"
void UART1_puts(char *s)
{
	UART3_write(s,strlen(s));
}
void UART3_puts(char *s)
{
	UART3_write(s,strlen(s));
}
void HEX_puts(char *s,void *pdata,int len,void (*xputs)(char *s))
{
	int blen;
	char buf[16*4];
	byte1 *p=(byte1 *)pdata;
	xputs(s);
	sprintf(buf,",len=%d\r\n",len);
	xputs(buf);
	while(len>0)
	{
		if(len>16)
		{
			blen=16;
		}
		else
		{
			blen=len;
		}
		BinToHEX(p,blen,buf);
		xputs(buf);
		len-=blen;
		p+=blen;
	}
	xputs("\r\n");
}
void UART3_puts_int(char *s,int a)
{
	char buf[256];
	sprintf(buf,"%s=%d\r\n",s,a);
	UART3_puts(buf);
}
void USART1_IRQHandler(void)
{
	byte1 a;
	if((USART1->ISR & USART_ISR_RXNE) == USART_ISR_RXNE)		//	수신버퍼에 데이터가 들어오면
	{
		a=USART1->RDR;
		//USART1->TDR=a;//DEBUG
		//USART3->TDR=a;//DEBUG
		sFIFO_push(&UART1_rx_fifo,a);
	}																											
	if(USART1->ISR & USART_CR1_TCIE)
	{
		if(sFIFO_Count(&UART1_tx_fifo)==0)
		{
			USART1->CR1 &= ~USART_CR1_TCIE;//전송중단
		}
		else
		{
			USART1->TDR = sFIFO_pop(&UART1_tx_fifo);
		}
	}
	UART_ER_Control(USART1);
	//HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_7);
}

void USART3_IRQHandler(void)
{
	byte1 a;
	if((USART3->ISR & USART_ISR_RXNE) == USART_ISR_RXNE)		//	수신버퍼에 데이터가 들어오면
	{	
		a=USART3->RDR;
		//USART1->TDR=a;//DEBUG echo loop-back
		//USART3->TDR=a;//DEBUG	echo loop-back
		
		sFIFO_push(&UART3_rx_fifo,a);
	}																											
	if(USART3->ISR & USART_CR1_TCIE)
	{
		if(sFIFO_Count(&UART3_tx_fifo)==0)
		{
			USART3->CR1 &= ~USART_CR1_TCIE;//전송중단
		}
		else
		{
			USART3->TDR = sFIFO_pop(&UART3_tx_fifo);
		}
	}
	UART_ER_Control(USART3);
}

'C언어,ARM' 카테고리의 다른 글

MSVCP60D.DLL  (0) 2020.08.29
VC++ 6.0 pragma comment lib 링커에러  (0) 2020.08.29
stm32-Invalid ROM Table  (0) 2020.08.15
stm32 keill컴파일러  (0) 2020.08.15
reentrant, thread safe(ty)  (0) 2020.08.09
Posted by 안녕1999
, |

stm32-Invalid ROM Table

C언어,ARM / 2020. 8. 15. 23:28

keill, ST-LINK
펌웨어 다운로드 안되는 현상.
특정 프로젝트에서만 발생

'C언어,ARM' 카테고리의 다른 글

VC++ 6.0 pragma comment lib 링커에러  (0) 2020.08.29
stm32 - USART3->BRR  (0) 2020.08.22
stm32 keill컴파일러  (0) 2020.08.15
reentrant, thread safe(ty)  (0) 2020.08.09
와치독 타이머, CPU_sleep, Flash write  (0) 2020.07.31
Posted by 안녕1999
, |

stm32 keill컴파일러

C언어,ARM / 2020. 8. 15. 23:03

stm32 keill컴파일러
UART통신시, 데이터 누락이 발생한다.
프로젝트마다 다름.
잘되는 프로젝트가 있고, 빠지는 프로젝트가 있다.
UART코드는 동일함.

BAUD를 변경하여 잘 동작하는 경우도 있다.

UART와 관련 없는 코드를 추가하거나 제거하면, 잘동작하는 경우도 있다.
아무 상관없는 코드에 UART통신이 영향을 받는다.
컴파일러 최적화 문제인듯.
gcc컴파일러를 사용할때는 이런 증상이 없었는데,
keill컴파일러는 최적화 문제가 발생한다.

'C언어,ARM' 카테고리의 다른 글

stm32 - USART3->BRR  (0) 2020.08.22
stm32-Invalid ROM Table  (0) 2020.08.15
reentrant, thread safe(ty)  (0) 2020.08.09
와치독 타이머, CPU_sleep, Flash write  (0) 2020.07.31
vc++ 6.0 shiftF5Fix.dll 등록안되는 문제  (0) 2020.07.26
Posted by 안녕1999
, |
thread safety(쓰레드 안전)는 여러개의 쓰레드가 동시에 어떤 코드(함수)를 실행해도, 올바른 결과가 나오는것을 보장하는것이다.
어떤 코드가, 내부(로컬)변수나 전역 변수를 가지고 동작을 한다면, 여러개의 쓰레드가 호출할때마다, 상태값이 달라지고,
올바른 동작을 안할 수 도 있다. 이런 코드들은 "thread safe하지 않다"고 말한다.
thread safe한 코드를 작성하는 방법은 해당코드가 내부(로컬) 또는 전역(글로벌) 변수에 상태를 저장하지 않으면 된다.
코드(함수)호출할때, 이런 상태값들도 같이 넣어주고, 이 상태값에 따라 동작하게 만들면 된다.

reentrant도 thread safe와 비슷한 개념이기는 하나,
reentrant는 코드가 자기자신을 여러번 호출하는 재귀적인 호출을 허용한다는 뜻이다.
thread와는 전혀 관련이 없는 개념이나, thread safe한 코드는 대부분 reentrant도 만족한다.
그렇다고 꼭 그런것은 아니다.
reentrant코드의 대표적인 예는 재귀호출하는 정렬함수, 여러개의 디렉토리를 모두 탐색하는 파일탐색 함수등이 있다.


'C언어,ARM' 카테고리의 다른 글

stm32-Invalid ROM Table  (0) 2020.08.15
stm32 keill컴파일러  (0) 2020.08.15
와치독 타이머, CPU_sleep, Flash write  (0) 2020.07.31
vc++ 6.0 shiftF5Fix.dll 등록안되는 문제  (0) 2020.07.26
FIFO버그  (0) 2020.07.25
Posted by 안녕1999
, |
//시간은 CPU클럭등에따라 달라질 수 있다.
#include "stm32f7xx_hal_iwdg.h"
INLINE void WDT_Init(void)
{
	IWDG->KR=IWDG_KEY_ENABLE;
	IWDG->KR=IWDG_KEY_WRITE_ACCESS_ENABLE;
	//IWDG->PR=IWDG_PRESCALER_256;//약9초
	IWDG->PR=IWDG_PRESCALER_128;//약4.5초
	//IWDG->PR=IWDG_PRESCALER_64;//약2.2초
	IWDG->RLR=1000;
	IWDG->KR=IWDG_KEY_RELOAD;
}
#define WDT_reset()		IWDG->KR=IWDG_KEY_RELOAD



//CPU_sleep명령은 인터럽트를 사용하는 경우, main함수 마지막에 넣어준다. 
//CPU가 불필요하게 무한루프를 도는것을 방지하여, 전력소모가 줄어든다.
void CPU_sleep(void)
{
	CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk));
	WFI();
}




#include "stm32f7xx_hal.h"
#include "stm32f7xx_hal_flash.h"
#ifndef FLASH_TIMEOUT_VALUE
	#define FLASH_TIMEOUT_VALUE       ((uint32_t)50000U)/* 50 s */
#endif
extern FLASH_ProcessTypeDef pFlash;
void   FLASH_Program_DoubleWord(uint32_t Address, uint64_t Data);
void   FLASH_Program_Word(uint32_t Address, uint32_t Data);
void   FLASH_Program_HalfWord(uint32_t Address, uint16_t Data);
void   FLASH_Program_Byte(uint32_t Address, uint8_t Data);
void   FLASH_SetErrorCode(void);
HAL_StatusTypeDef _FLASH_write(uint32_t Address,void *pdata,int len)
{
	HAL_StatusTypeDef status = HAL_ERROR;

	/* Process Locked */
	__HAL_LOCK(&pFlash);

	/* Check the parameters */
	assert_param(IS_FLASH_TYPEPROGRAM(TypeProgram));

	/* Wait for last operation to be completed */
	status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);

	if(status == HAL_OK)
	{
		//uint64_t *p64;
		uint32_t *p32;
		uint16_t *p16;
		uint8_t *p8,*p=(uint8_t*)pdata;
		
		/*안됨 p64=(uint64_t*)p;
		while(len>=8)
		{
			FLASH_Program_DoubleWord(Address,*p64);
			p64++;
			Address+=8;
			len-=8;
		}
		p=(byte1*)p64;*/
		
		p32=(uint32_t*)p;
		while(len>=4)
		{
			FLASH_Program_Word(Address,*p32);
			p32++;
			Address+=4;
			len-=4;
		}
		p=(byte1*)p32;
		
		p16=(uint16_t*)p;
		while(len>=2)
		{
			FLASH_Program_HalfWord(Address,*p16);
			p16++;
			Address+=2;
			len-=2;
		}
		p=(byte1*)p16;
		
		p8=(uint8_t*)p;
		while(len>0)
		{
			FLASH_Program_Byte(Address,*p8);
			p8++;
			Address++;
			len--;
		}
		
		/* Wait for last operation to be completed */
		status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);

		/* If the program operation is completed, disable the PG Bit */
		FLASH->CR &= (~FLASH_CR_PG);
	}

	/* Process Unlocked */
	__HAL_UNLOCK(&pFlash);

	return status;
}
#ifndef FlashSAVE_ADDR
	#define FlashSAVE_ADDR 		((uint32_t)0x080C0000)
#endif
void Flash_Read(uint32_t addr,void *pData,int len)
{
	memcpy(pData,(void*)(FlashSAVE_ADDR+addr),len);
}
int Flash_cmp(uint32_t addr,void *pData,int len)
{
	int r=0,blen;
	byte1 buf[512],*p=(byte1*)pData;
	//DEBUG_puts("Flash_cmp()");
	while(len>0)
	{
		if(len>sizeof(buf))
		{
			blen=sizeof(buf);
		}
		else
		{
			blen=len;
		}
		Flash_Read(addr,buf,blen);
		r=memcmp(buf,p,blen);
		if(r!=0)
		{
			//DEBUG_puts("다름");
			break;
		}
		else
		{
			//DEBUG_puts("동일함");
		}
		len-=blen;
		p+=blen;
	}
	//DEBUG_puts("Flash_cmp()_END");
	return r;
}
void _Flash_Write(void *pData,int len)//모두 삭제된 다음에 저장된다.(부분저장이 안됨)
{
	uint32_t PageError;
	static FLASH_EraseInitTypeDef a;
	a.TypeErase = FLASH_TYPEERASE_SECTORS;
	a.Sector  = FLASH_SECTOR_7;
	a.NbSectors = 1;
	a.VoltageRange=FLASH_VOLTAGE_RANGE_3;
	LED1_ON();
		HAL_FLASH_Unlock();
			HAL_FLASHEx_Erase(&a,&PageError);
			_FLASH_write(FlashSAVE_ADDR,pData,len);
		HAL_FLASH_Lock();
	LED1_OFF();
}
void Flash_Write(void *pData,int len)//모두 삭제된 다음에 저장된다.(부분저장이 안됨)
{
	if(Flash_cmp(0,pData,len)!=0)
	{
		_Flash_Write(pData,len);
	}
	else
	{
		//DEBUG_puts("동일한 내용으로, 저장 skip.");
	}
}

'C언어,ARM' 카테고리의 다른 글

stm32 keill컴파일러  (0) 2020.08.15
reentrant, thread safe(ty)  (0) 2020.08.09
vc++ 6.0 shiftF5Fix.dll 등록안되는 문제  (0) 2020.07.26
FIFO버그  (0) 2020.07.25
cannot open file "nafxcw.lib"  (0) 2020.07.18
Posted by 안녕1999
, |

vc++ 6.0 shiftF5Fix.dll 등록안되는 문제
관리자권한으로 실행하면됨.

'C언어,ARM' 카테고리의 다른 글

reentrant, thread safe(ty)  (0) 2020.08.09
와치독 타이머, CPU_sleep, Flash write  (0) 2020.07.31
FIFO버그  (0) 2020.07.25
cannot open file "nafxcw.lib"  (0) 2020.07.18
MFC 파일 드래그 드롭  (0) 2020.07.18
Posted by 안녕1999
, |

FIFO버그

C언어,ARM / 2020. 7. 25. 22:05

분명히 버그가 있는데, 찾을 수 없었다.
원인은 '='하나 빼먹어서 밀리는 증상 나옴,
if(p->w>p->buf_len)//버그(ERR)
if(p->w>=p->buf_len)//버그수정

 

#ifndef FIFO_H
#define FIFO_H

#ifndef byte1
	#define byte1 unsigned char
#endif
#ifndef byte2
	#define byte2 unsigned short
#endif

typedef struct 
{
	byte1 *buf;
	int r,w,cnt,buf_len;
	int new_line_cnt,new_line_cnt_old;
}sFIFO;
void sFIFO_init(volatile sFIFO *p,byte1 *buf,int len);
void sFIFO_push(volatile sFIFO *f,byte1 a);
byte1 sFIFO_pop(volatile sFIFO *p);
int sFIFO_write(volatile sFIFO *p,void *pdata,int n);
int sFIFO_read(volatile sFIFO *p,void *pdata,int n);
#define sFIFO_Count(psFIFO)	((psFIFO)->cnt)
#define sFIFO_EmptyCount(psFIFO)	((psFIFO)->buf_len-(psFIFO)->cnt)
//c문자가 나오기전까지 읽는다.
//c문자는 읽고 버린다.
int sFIFO_read_while_not(volatile sFIFO *p,void *pdata,int n,char c);
void RTrim(char *s);

void DEBUG_FIFO_view(volatile sFIFO *p);
#endif
#include "..\src\fifo.h"
#include "cpu.h"
void DEBUG_FIFO_view(volatile sFIFO *p)
{
	char buf[128];
	sprintf(buf,"cnt=%d,w=%d,r=%d",p->cnt,p->w,p->r);
	DEBUG_puts(buf);
}
void sFIFO_init(volatile sFIFO *p,byte1 *buf,int len)
{
	p->buf=buf;
	p->buf_len=len;
	p->cnt=0;
	p->r=0;
	p->w=0;
	p->new_line_cnt=0;
	p->new_line_cnt_old=0;
}
void sFIFO_push(volatile sFIFO *p,byte1 a)
{
	if(p->cnt<p->buf_len)
	{
		p->buf[p->w]=a;
		p->w++;
		if(p->w>=p->buf_len)
		{
			p->w=0;
		}
		else
		{
		}
		if(a=='\n')
		{
			p->new_line_cnt++;
		}
		else
		{
		}
		p->cnt++;
	}
	else
	{
		//full
	}
}
int sFIFO_write(volatile sFIFO *p,void *pdata,int n)
{
	int cnt=p->cnt;
	byte1 *a=(byte1 *)pdata;
	while(n>0)
	{
		if(p->cnt<p->buf_len)
		{
			p->buf[p->w]=*a;
			p->w++;
			if(p->w>=p->buf_len)
			{
				p->w=0;
			}
			else
			{
				//ok
			}
			if(*a=='\n')
			{
				p->new_line_cnt++;
			}
			else
			{
			}
			p->cnt++;
		}
		else
		{
			//full
			break;
		}
		n--;
		a++;
	}
	return p->cnt-cnt;
}
byte1 sFIFO_pop(volatile sFIFO *p)
{
	byte1 a;
	if(p->cnt>0)
	{
		a=p->buf[p->r];
		p->r++;
		if(p->r>=p->buf_len)
		{
			p->r=0;
		}
		else
		{
			//ok
		}
		p->cnt--;
	}
	else
	{
		//empty
		a=0;
	}
	return a;
}
int sFIFO_read(volatile sFIFO *p,void *pdata,int n)
{
	int cnt=p->cnt;
	byte1 *a=(byte1 *)pdata;
	while(n>0)
	{
		if(p->cnt>0)
		{
			*a=p->buf[p->r];
			p->r++;
			if(p->r>=p->buf_len)
			{
				p->r=0;
			}
			else
			{
				//ok
			}
			p->cnt--;
		}
		else
		{
			//empty
			break;
		}
		n--;
		a++;
	}
	return cnt-p->cnt;
}
//c문자가 나오기전까지 읽는다.
//c문자는 읽고 버린다.
int sFIFO_read_while_not(volatile sFIFO *p,void *pdata,int n,char c)
{
	int cnt=p->cnt;
	byte1 *a=(byte1 *)pdata;
	while(n>0)
	{
		if(p->cnt>0)
		{
			*a=sFIFO_pop(p);
			if(*a==c)
			{
				break;//중단
			}
			else
			{
				//계속
			}
		}
		else
		{
			//empty
			break;
		}
		n--;
		a++;
	}
	*a=0;
	return cnt-p->cnt;
}
#include "string.h"
void RTrim(char *s)
{
	char *p;
	int len=strlen(s);
	//DEBUG_puts_str("RTrim_START",s);
	if(len>0)
	{
		p=s+len-1;
		while(len>0)
		{
			len--;
			switch(*p)
			{
			case ' ':
			case '\r':
			case '\n':
			case '\t':
				*p=0;
				break;
			default:
				len=0;//break;
				break;
			}
			p--;			
		}
	}
	else
	{
		//길이가 0
	}
	//DEBUG_puts_str("RTrim_END",s);
}

'C언어,ARM' 카테고리의 다른 글

와치독 타이머, CPU_sleep, Flash write  (0) 2020.07.31
vc++ 6.0 shiftF5Fix.dll 등록안되는 문제  (0) 2020.07.26
cannot open file "nafxcw.lib"  (0) 2020.07.18
MFC 파일 드래그 드롭  (0) 2020.07.18
ST-LINK 펌웨어 쓰기 설정  (0) 2020.07.11
Posted by 안녕1999
, |
cannot open file "nafxcw.lib"

'C언어,ARM' 카테고리의 다른 글

vc++ 6.0 shiftF5Fix.dll 등록안되는 문제  (0) 2020.07.26
FIFO버그  (0) 2020.07.25
MFC 파일 드래그 드롭  (0) 2020.07.18
ST-LINK 펌웨어 쓰기 설정  (0) 2020.07.11
xmega - timer0  (0) 2020.06.27
Posted by 안녕1999
, |

최근에 달린 댓글

글 보관함