嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 8 F% ^5 l, [$ q8 m3 ~5 z8 T; W& k
3 F  s1 v8 j' Q6 W% l* t2 k
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>6 N" D: |6 X) C' a! X6 k; V) v, Z
#include <unistd.h>! P# t+ S1 q5 v2 L
#include <sys/mman.h>! X8 p" k) N- i" @& z
#include <sys/types.h>
7 f& u/ U' E0 f5 O: W4 I#include <fcntl.h>. c1 l$ S2 x4 j8 }/ D$ z
6 H9 x4 [* k- A4 _7 W9 @6 {: H1 h
#define SHAER_RAM_BASE_ADDR    (0x80000000)   1 I# r8 m; k/ s& I1 ^8 o9 E9 {; k

8 y* j9 w% X+ Q) i" L/ z) C: T% ^: }typedef struct" k; W9 [' L+ o
{
" W; H0 q, s5 X: X7 ], r% O2 h3 y        unsigned int a;
5 t. p! ]' T0 K, a0 D% r        unsigned int b;
9 S1 `7 F$ S8 G4 t0 g& M* D) K4 o        unsigned int packet_cout;% F* d% y2 D8 q" z; r* B, N. o: G
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 A3 x) x1 d3 c" ]/ Y! Q$ ?- \3 T. d7 s9 ^9 p8 N
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
1 i* j: c$ m7 W' J8 d" G9 Hunsigned int count_copy = 0;
/ v3 N: d) G2 [3 |+ i: n$ a4 @. K- I' N
* k5 s( k& ]5 T8 f* X2 A$ P! B" e
int main()
9 E$ F% X7 {" U- T7 ^{" q* X  s, A6 Y0 J* C
        pRX_MSG_PROTOCOL pshreRAM = NULL;
) u8 U$ ?' F# L* d. M2 H9 P        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
" B* o% A& O2 h6 u, a7 ?+ h3 o  k7 w1 a$ b1 {5 n
        while(1)" k: R2 e: d$ O5 q& _/ y2 [
        {' U3 {/ \- a& d3 k9 r* n0 v
                read_MSG_buffer(pshreRAM);6 W3 u! v$ w7 w; W
        }                / |0 p* y! k  ]# O! N8 {5 I
}, Y& ^+ C( o' a# Z- b" M0 _
1 \: j7 l6 ^# }# @: [1 K$ _
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
! F% M/ `4 R! Y) r0 h: Y6 ]{" X$ u) D1 c7 J/ u/ \
        RX_MSG_PROTOCOL buf;
9 d- D2 h( \, q( \+ ~; R        - K8 |$ u0 O8 Q$ O6 k7 S& }
        buf.a = pshreRAM->a;
9 _; q& h" B6 i1 L        buf.b = pshreRAM->b;
4 v  X  A1 A/ D: N' N4 O3 K        buf.packet_cout = pshreRAM->packet_cout;
; G$ v1 a( U' n        - O( M, n8 G, N. i
        if(buf.packet_cout != count_copy)
+ T( M9 `% ~5 e- s. w; f% w. Y" e( N        {% X% {; T1 [1 x& ?8 H: U/ G  {' [4 @) H
                printf("a is %d\n", buf.a);
  R6 P' P6 x6 V7 v) ?  |* Q" Q                printf("b is %d\n", buf.b);# _0 p! A- U7 p- D6 J
                printf("count is %d\n", buf.packet_cout);
; k$ p+ b6 J6 V6 v                count_copy = buf.packet_cout;
$ Q4 T) N0 k3 Y+ {' B        }* z% b% E1 g; y4 f1 z
        else9 {  C' k; W6 b( J& E
        {
* T; Y- G+ F3 b1 B/ b( j& u! s+ [                printf("No effective message!");
* M5 k9 }( |  p& {" m; w        }- h' }) M0 A& h2 C
}
3 q0 s: r+ G5 z+ ]/ b1 Y& T+ R0 E9 S! l8 ?0 r

/ L( [% p. P' n: _但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。+ X5 z  {  _, N! i3 w$ y( Y' A
使用下面代码,对内存使用了mmap函数后:
" X0 `5 T0 T2 ~3 H! q% B#include <stdio.h>
% A. y; Y5 Z# T% C. Q, I- ]#include <unistd.h>; Q6 J, B$ ?/ ?1 T! p% C* F2 s
#include <sys/mman.h>: V; I8 \) f' ~5 _7 E6 ^* Y
#include <sys/types.h>
1 r) e$ A+ A9 m#include <fcntl.h>+ ?9 Q2 S( O; D. f

7 m3 Q- q/ A6 y: K: i' {3 a9 F: W1 |#define SHAER_RAM_BASE_ADDR    (0x80000000)9 f0 w+ I7 R( C. D, D
#define SHAER_RAM_SIZE         (0x20000)   
: Y4 b, r8 ?6 a* P, P" A! ~: }  d. }, n5 E6 q/ `
typedef struct
# S  m# y: Z9 B& K{
2 Q8 V& G! J7 o" C3 f* _2 k. M' ~        unsigned int a;( C1 i# O( M2 U8 S/ r
        unsigned int b;
7 C+ a' w: P$ R) a3 ]+ D/ l        unsigned int packet_cout;
% b$ H( y0 F# `% w* j1 D}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; Q. N: u8 c' X9 L4 N% ?. W
5 ^, ~+ `5 Q2 q% x0 t- d8 Fvoid read_MSG_buffer(int *baseaddr);
& z3 g1 ?3 D9 f2 P. f+ `4 [6 Eunsigned int count_copy = 0;1 D3 E$ n) V/ r8 d6 x! ~$ \$ S& ~& X

0 _3 L9 @0 |$ a, bint main()
# T: Y( I* I9 d& S, g1 L{
* v# g0 w4 q: W7 P2 J  W' F        int fd;1 e+ q/ y2 ~' m. q/ `
        int *mem = NULL;7 @/ z' C$ h/ |9 L1 y& j

+ x4 M& P; v+ y8 a/ {, r        if((fd = open("/dev/mem", O_RDWR)) <0)
# R1 h# m& M" \$ Q        {4 E% s7 G) r; ?! O+ V0 a6 P2 P
                perror("open error");7 M( H3 [- D7 U- q' h2 _: y
                return -1;! x: D9 r1 v% x7 w  K/ I
        }
' v- q7 g' z% z# Y$ E  Z# g        " x7 G. W" f2 q- J
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
" C' E+ w$ P# e$ u  G
8 L6 E9 M9 e' p2 T        while(1)/ X1 w4 {3 I7 G/ {+ C" p6 B
        {
/ n: q! O/ U9 @0 P6 `, g( Y) f                read_MSG_buffer(mem);
& B2 T% b* k4 k. W9 x3 o$ g        }               
6 k- O, a3 j/ u, l" Z}! N3 _( |! u" h$ n3 C9 V( `6 m

- a6 G, M* t( _. Q2 {. l; [void read_MSG_buffer(int *baseaddr)9 E7 m# b8 W- M0 U  j' S
{6 y5 X. x8 ^; {
        pRX_MSG_PROTOCOL pshreRAM = NULL;
; w2 |/ l  T* c/ z  w( e4 A
: g! E2 t9 f  g& A        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
/ R, R: {/ C6 Q# t
6 u  B2 O, d# e6 v        if(pshreRAM->packet_cout != count_copy)/ L. S" r8 A. q* z  d: F2 v% K
        {3 A9 A* @2 a& M1 T2 _) }+ j% }
                printf("a is %d\n", pshreRAM->a);
+ q/ Q" m+ d4 t3 ?- _" e) q4 o' Q                printf("b is %d\n", pshreRAM->b);
4 p' W: T3 l* N3 n5 w7 O                printf("count is %d\n", pshreRAM->packet_cout);* S1 L5 v% O- d/ a
                count_copy = pshreRAM->packet_cout;
, Z4 z2 @3 A! u6 J! B& M        }
8 F% [- D3 ^* p        else6 N6 @, `% L( H7 h9 F. ~) l/ T; O/ ~
        {4 E9 x# ~- G8 s/ a1 q1 i
                printf("No effective message!\n");
9 l; a. L3 P! V+ h0 o        }
" P# c. i; W( t& j5 f}# L  w# p* P. o" Q. s
8 i1 [  h8 N% v  E7 z& @7 d
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
$ G8 D9 s/ j8 f! i! e: {5 ^# T8 i7 P1 g* \3 S1 F" C: f

& E: E' M  p4 C% A  b  b. i
3 A: q* ]" ?; A
) _% p: a: ]2 n; C




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