2010년/7월

7월21일 JAVA(동기화) ARM(7-segment,USART1)

뽀얀햄스터 2010. 7. 21. 09:33

지금까지는 각 쓰레드는 독립적인 데이타를 가지고 비동기적으로 실행되었다.
그러나 프로그램에서 여러 개의 쓰레드가 동시에 실행될 경우에
하나 이상의 쓰레드가 동일한 데이타를 동시에 사용하는 경우
프로그램은 틀린 결과를 산출할 수 있다.

그래서 동기화를 해야한다. 만약에 은행에서 돈을 인출할때 동시에 같은시간에 2000만원잔고에 1900만원씩 인출하면 원해 처음에 하고 두번째는 100만원이 남아서 인출이 안되어야한다. 근데 동기화가 안되어있으면 둘다 가능해져버린다.그래서 쓰레드에서 데이터가 실행할경우 하나 이상의 쓰레드가 사용하지 못하게 하기위해서 생겨났다.

이 동기화는 운영체제나 데이타베이스 나 기타 여러 프로그램에서 자주사용된다.
API같은경우 LOCK UNLOCK이라든지 있지만 자바에서는 간단하게 synchronized(객체)라고 선언해주면된다. 물론 객체아닌 변수나 메소드도 가능하다.

==========================================================================================
==========================================================================================
#define RCC_PORT  (*(volatile unsigned *)0x40021018)
#define PORTC_LOW  (*(volatile unsigned *)0x40011000)
#define PORTC_HIGH  (*(volatile unsigned *)0x40011004)
#define PORTC_BSRR  (*(volatile unsigned *)0x40011010)
#define PORTC_BRR  (*(volatile unsigned *)0x40011014)

static void delay(volatile double a)
{
  for(;a>0;--a)
  {
     ;
  }
}
void segment() //전부 불켜기 
{
   PORTC_LOW = 0x33333333;
   PORTC_HIGH = 0x3//0  power

void reset() //전부 셋
{
  PORTC_BSRR = 0xFF;
  
}
void set()  //전부 리셋 
{
  PORTC_BRR= 0xFF;
  
}
int main(void)
{
  int i;
  char s[10]={
  0x3F,0x6,0x9B,0x8F,0xA6,0xAD,0xBC,0x27,0xbF,0xA7
  };
  RCC_PORT = 0x1<<4//포트 C 열기 
  while(1)
  {
    segment();
    
    for(i=0 ;i<10;i++)
    {
      reset();
      PORTC_BRR =s[i];
      delay(30000);
    
    }
    
   
  }
  
   
}
=====================================================================
=====================================================================
시리얼 통신에 대한내용이다 사실 너무 어렵다 ㅠ

일단 통신에 기본은 바로 Rx와 Tx에 대한 내용이다

순서대로 설명하자면 바로 이것이다

1. RCC 통해 Rx Tx 포트 열기 USART1 열기
2. Rx Tx를 input output 설정(arm입장에서 전송이 output  수신이 input이다)
3. USART의 통신설정하기 ( 전송속도, 패리티, 데이터비트 정지비트 흐름제어)
4. 전송하기
5. 잘전송되었나 확인하기


언제나 늘 사용하는 RCC이다

자 회로도를 보게 되면 UART1과 UART2가있다. 일단 UART1를 통해서 사용하며
PORTA에 연결되어있음 알수있다. 그것도 PA9와 PA10에 대해서

그렇기 때문에 RCC에서 PORTA와 USART1를 열어야한다.



당연히 RCC 주소인 0x4002 1018에서 USART1EN 과 IOPAEN 에 값을 1을 지정하면
본격적으로 사용할수가 있다.

그리고 다시 PORTA를 보자
회로도에서 본것처럼 TX가 PA9이고 RX가 PA10이다.


자이 이제 TX는 당연히 output모드  Rx는 intput모드로 해야한다.

Tx는 output이기때문에 당연히 MODE9에 00이 아닌 01 이나 10 11 을 넣어서 output mode로 설정해야한다 그리고 CNF10에 값을 넣어야하는데 00이면 일반적인 output이고 alternate function은 대충 변화되는 내용을 output인데 사실 저것을 보고 00으로 했다가 당연히... 깜깜무소식에 ㅠ  울다가 10을 통해서 Alternate function을 사용했다 사실... 영어실력이 떨어져서 겨우겨우 해석하면서 하는데 어렵긴하다.
사실 그안에 내용은 전부 메뉴얼에 나와있다 못찾아서 -_-;;; 그렇지



사실 메뉴얼에서 몇쪽만 올라가게되면 바로 USART를 사용할때 RX와 TX의 사용법에대해서 나와있다. 당연히 전이중통신이므로 RX에서는 입력모드의 input floation을 사용하고 TX에서 Alternate function push-pull을 사용하게 한다.
그래서 (*(volatile unsigned *)0x40010804) 값에 0x4B를넣게 되면 제대로 RX와 TX에서값이 들어가게된다.(이거찾는동안 고생했다 ㅠㅠ)
자 이제 PORTA에 대한 설정이 모두 끝이 났다. 하지만
더어려운 USART1에 대한 통신 프로토콜 설정이 남아있다.

메모리 맵을 보게 되면  0x4001 3800 에서 부터 USART1에 대한 내용이 다있다.


그리고 USART에 대한 register map 대한 내용이다  일단 기본적으로 빨간색을 밑줄을 친 4개가 제일 필요하다 주요구성요소는 하나하나 다알려면 어렵기때문에 엑기스만 쪼옥 뽑아서 사용해 본다.


.... to be coutinue...