嵌入式开发者社区

标题: OMAPL138的内存映射是否在Linux下已经完成??? [打印本页]

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
  W" u* \0 \0 z+ m, @# r: |* y3 r* w! Z
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>: o# N7 e' g0 {) h
#include <unistd.h>( `, j5 R- ?6 e( {$ A3 Z
#include <sys/mman.h>
- ]; `# t) N+ t#include <sys/types.h>
6 b/ Y# b" a0 }% X. W#include <fcntl.h>0 q2 e! M1 Y- v) }5 ^

2 _3 r" _+ O; {* L9 e#define SHAER_RAM_BASE_ADDR    (0x80000000)   
7 J7 Q6 X0 k; v* }- a: }+ I* ]4 p5 k+ m; r7 R# p( ]( ^1 E$ l
typedef struct5 _0 q& A" ~  y
{$ ]! W( Z  T; y% G( Z& j$ Z
        unsigned int a;
/ ~& B$ ^4 [$ p$ }+ Y. b        unsigned int b;& r# ]- x% Z% r& s- c' R
        unsigned int packet_cout;
! N6 t' P) f; V$ [}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 `9 Q4 O6 y. I  g! i8 T# d& E# }6 O3 Q4 N
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
  ^2 _4 b1 }$ c3 D$ Runsigned int count_copy = 0;8 [/ E$ T4 ^+ w, ]
2 }& e* y5 w2 P5 l1 L

' l* c4 E( X) }int main()* X! G7 p  a7 k  A" _2 h
{
, u$ }' v1 N% A0 T        pRX_MSG_PROTOCOL pshreRAM = NULL;
4 Y; I) x* T8 j6 S) x        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;' {( q  a' G* l
: F' R! ~4 d5 L. W9 W: r2 n8 w5 D
        while(1)
, c9 b" t& {0 i: d# u4 Y        {* [# z9 R) p7 e/ j7 T
                read_MSG_buffer(pshreRAM);
6 S. ~9 c# B8 Q        }                ' r5 k$ ?- \: o6 Y# Y  b1 _
}, c! C4 `4 R! a! a% }6 Q8 C1 [$ P
: L# u$ E, F- I
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
- D9 o2 d' N) k2 O{0 C* ^6 }: v0 @
        RX_MSG_PROTOCOL buf;) H: y% `  F) h$ J% R, v
        
9 M' \; Z$ O& t5 V! ?        buf.a = pshreRAM->a;1 Q6 N: ~) t  Z6 D/ O  a( f' V& @) I  A
        buf.b = pshreRAM->b;6 [& v8 ]5 S6 T* T
        buf.packet_cout = pshreRAM->packet_cout;
5 g+ q) s2 d' F% t8 z; k        0 H: \- a# H* |* z% r$ F) e
        if(buf.packet_cout != count_copy)& Y/ e  N2 x4 B  X9 y3 p
        {
5 v6 f5 y4 z& M( \+ n                printf("a is %d\n", buf.a);
. |+ w- ~9 \, Q( `9 J                printf("b is %d\n", buf.b);
" i% V" z. r# i% w. Q                printf("count is %d\n", buf.packet_cout);$ P# N7 e, Y! b
                count_copy = buf.packet_cout;
' _* J) x2 t5 @# T: I+ R        }
# I8 w. [0 U5 C( z/ Q# B) m) _7 {4 Q9 ?        else. l, q3 @$ I3 n) L+ o) n
        {$ t! Z& K4 h( {) Y7 }' P: G
                printf("No effective message!");
4 x1 u  ~3 Z% x# g2 v0 |        }
: |: w0 i! X) p8 _4 O+ M) c}
! z7 g+ K/ F+ @% Q: n9 Z" M, j/ e7 M9 N" _2 Q& m0 l% F
+ \- @3 ]7 j; Y: e/ T$ h6 \. {
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。2 p2 L3 F& {' S+ J, Y; ~
使用下面代码,对内存使用了mmap函数后:
- }' ~( h! p* T* o1 e' B#include <stdio.h>- B* H2 S- v" w
#include <unistd.h>2 `1 C3 U6 H0 ^
#include <sys/mman.h>
3 u  K( d# K7 S) h- o/ Q#include <sys/types.h>
; N/ x, X2 ?. Y7 u" e#include <fcntl.h>( U  K! `" m3 [1 D2 u

- y1 d) Q6 S  @5 ^" F6 G#define SHAER_RAM_BASE_ADDR    (0x80000000)
* o: V3 Y: q& E- y#define SHAER_RAM_SIZE         (0x20000)   
1 i) R0 E. ^' q2 G7 b- F! Q+ i0 F8 M/ j$ u& ^* n
typedef struct" f4 U. E9 k: e! Y5 J
{
! I7 K; h6 @5 ~5 m        unsigned int a;
& {- q4 X0 c% h3 `$ O6 z# B        unsigned int b;4 R5 f& C( d8 N& i4 b
        unsigned int packet_cout;* ]: Q1 G8 Q/ w  }0 E" y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 O2 \2 L7 w  D# h: T0 K
" M$ Q' ^+ S+ j# B' ~* }void read_MSG_buffer(int *baseaddr);- Y& _3 R' _  M: V+ J1 n
unsigned int count_copy = 0;
1 E& l* J3 I$ p' S8 g+ {, K5 r
: F+ n/ j: u$ @, Uint main(): h; v+ i: m, S
{
* `" @( k9 @4 p  R0 v        int fd;( o5 a; A9 k- d8 f9 x( W( w
        int *mem = NULL;  n3 b! ?3 L( u4 e* d
: P, U0 g+ H; ?, w; e8 J; V; j$ W' B
        if((fd = open("/dev/mem", O_RDWR)) <0)9 p" e9 Z2 o+ R$ c5 @( z0 v% o
        {4 b  ^5 E2 A& R1 a
                perror("open error");
% W  h* ]* i) Q                return -1;
( t$ }- V- M2 H/ l" Y5 s. z        }! k- Q' p/ D! ?" t% j. V
        1 u% v' Q+ \* k9 v
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);7 [+ V/ l2 ]* f

: ?$ F  l, p- j$ R5 Z  u3 t        while(1)
& `, S" L" \9 g1 W: `& Y+ V        {9 K% v$ f5 {# F7 v* a8 ?
                read_MSG_buffer(mem);
/ ^/ k8 k/ k) |. R5 H  ]  a8 Y& I9 m, f        }                + j; l8 S: \+ l0 P8 L$ \
}
+ {8 c# H+ y4 g- }0 u" t0 }' H6 m3 C- z5 q
void read_MSG_buffer(int *baseaddr)
: W3 e! `% t5 G4 A0 o5 ]5 z3 a{  F1 ]# R# @* v0 N0 X! t! ]
        pRX_MSG_PROTOCOL pshreRAM = NULL;* G' d$ i8 ]; ~  B' d& r7 h7 d

( I# ]. Z+ u8 a1 Q9 a3 a1 \        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
' k- g1 V' e7 w/ P/ `3 g& K) b* x( a" `- O( `
        if(pshreRAM->packet_cout != count_copy)
/ L7 V. J) `6 b! W8 }& o0 U( v        {
) G  k& d" F, q( S                printf("a is %d\n", pshreRAM->a);
7 `/ Q# Y6 g/ O* n                printf("b is %d\n", pshreRAM->b);
: N  \/ S5 i; k( o6 K+ T                printf("count is %d\n", pshreRAM->packet_cout);% N4 n, ~7 b8 p; m8 k
                count_copy = pshreRAM->packet_cout;3 n$ ~, o! {+ D1 [& J5 D7 j8 S
        }$ r& _! L+ \% P$ J4 I0 U* z4 d3 q2 X
        else6 F. j! {6 @" [2 u
        {
' V' q( X+ ?; m# t0 B9 L                printf("No effective message!\n");
5 N" d! y# `. u3 t1 X        }
7 ^. a2 b- o  e  V7 K0 x0 e( g}
0 i& Y0 [) B2 P: ~( V6 r0 c; K, i3 D; ^1 s0 t0 g7 d
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???4 L* A/ j7 a8 J! y
- w# F1 i, K; `6 _% P8 U
4 Y; Y* L3 Z( |6 d4 l+ y
7 X* W; T9 a8 I6 {  z% Y

5 |4 _. x2 ~. [* ^- B! ]




欢迎光临 嵌入式开发者社区 (https://51ele.net/) Powered by Discuz! X3.4