하드웨어를 추상화하는 C언어로 된 라이브러리를 구현한다면?

progsows의 이미지

안녕하세요.

요새 리눅스 상에서 하드웨어를 추상화(?) 하는 계층 (라이브러리)를 제작해야 하는 일이 생겼습니다.

즉... A라는 일을 하는 장치를 리눅스 시스템에 연결해 준다고 할 때,

이 장치는 /dev/Acase1이라는 이름으로 된 디바이스 파일일 수도 있고,

다른 회사의 것이라면 /dev/Acase2라는 이름으로 된 디바이스 파일일 수도 있고,

시리얼 통신을 사용하여 특정한 프로토콜로 통신하여 A라는 일을 수행할 수도 있습니다.

이런 다양한 종류의 장치 형태에 상관없이 상위 프로그램에서 그냥 do_A()라는 C언어 함수 호출을

통해 A라는 일을 할 수 있도록 하는 HAL (Hardware Abstraction Layer) 비스무리한 API 계층을

구성해야합니다.

물론 위의 예 중 각각의 경우 Acase1.c, Acase2.c, Aserial.c 등의 파일은 만들어 줄 수 있겠지요.

이것을 상위 프로그램이 쓸 수 있는 do_A()라는 함수와 어떻게 깔끔하게 연결해 줄 수 있을지 좋은 생각이

나질 않네요. 물론 사전에 어떤 종류의 장치가 달려있는지 정보는 제공을 해 준다고 가정합니다.

그 정보를 가지고 컴파일 시 Acase1_do_A() -> do_A(), 혹은 Acase2_do_A() -> do_A() 이런 식으로

연결(?) 해 줄 수 있는 좋은 방법이 없을까요?

고수 여러분들의 고견을 부탁 드리겠습니다. 그럼~ 꾸벅~

cppig1995의 이미지

저도 왕초보지만... 함수포인터를 이용할 수 있지 않을까요?

#define A_CASE1 1
#define A_CASE2 2
#define A_SERIAL 255
 
typedef ???(*afun_t);
afun_t afun;
 
void init_A(int a)
{
 if(a == A_CASE1) afun = do_Acase1;
 else if(a == A_CASE2) afun = do_Acase2;
 else if(a == A_SERIAL) afun = do_Aserial;
 ...
}
 
void do_A(some_arguments)
{
 afun(some_arguments);
}
 
void do_Acase1()
{
...

------------------------------------------------------
In simplexitate est opportunitas. --cppig1995
"x86-64 운영체제를 만들자" 강좌: http://kldp.org/taxonomy/term/3663
2007학년도 대전월평중학교 1학년 3반 학급카페: http://cafe.naver.com/djwp0713

Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.

superkkt의 이미지

autotools를 사용해서 컴파일 당시에 해당 장치와 관련된 파일만 컴파일하게 하는것이 가장 깔끔한 방법이 아닐까요? 즉, 각 장치별로 작성한 소스파일에는 모두 do_a() 라는 함수가 정의되어 있겠고요. 컴파일 타임에 autotools가 조건을 체크해서 필요한 파일 하나만 컴파일을 하는거죠.

======================
BLOG : http://superkkt.com

======================
BLOG : http://superkkt.com

progsows의 이미지

고견들 감사합니다.

후에 윈도우 상에서도 동작하도록 하려면 아무래도 함수 포인터 방법이 더 낫겠지요?

제 생각이 맞는지는 모르겠습니다만...

송효진의 이미지

A라는 일을 하는 하드웨어가 여러가지인것 같네요.
그게 컴파일타임에 확정되는것도 아니고,
쓰면서 바뀔수도 있는것 같은데,
그럼 do_A() 안에 switch() 문이 들어가는게 맞을것 같은데,
그건 아닌가요?

emerge money

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.