嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
5 ?! {2 N' `7 P( E# M. _
9 l. U( R2 e5 NOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>! Z* o9 K7 ~4 ^( b; R
#include <unistd.h>& n( ]! x! H2 u8 E: P
#include <sys/mman.h>
. j3 ~8 y5 M% G" T( ]) u" T' b$ V+ V#include <sys/types.h>) v% g' m( s" U; @! C
#include <fcntl.h>; o" ]9 O3 [: I/ y2 M

" y; D# D! u+ w. Z7 P#define SHAER_RAM_BASE_ADDR    (0x80000000)   
: E6 t! {1 E" H, y  h+ \+ v6 z& J1 o/ J* A( V
typedef struct& \$ d7 w+ h4 M5 q
{
6 U  y$ w8 a' m        unsigned int a;, N/ o" x5 M1 a7 u: ~
        unsigned int b;) j; J% q! H$ j8 L1 N
        unsigned int packet_cout;
' c  ~3 H. t# O/ l7 h+ d& Z}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' G4 k6 c/ _  G7 I) i6 y( M# ^7 U; o! K* ^3 k7 R
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
* t% V9 b# y+ Runsigned int count_copy = 0;
- I7 }8 C  J0 i. `: _9 Y7 [% D
4 e: I) Z8 \1 i, X" X) l' R8 ?+ y7 M! b" k+ E4 J
int main()0 [) [! _5 O4 D# Q
{# {1 S8 Z  O& C
        pRX_MSG_PROTOCOL pshreRAM = NULL;
0 A% |# h& m, Z' |2 \$ X        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
. b' {0 ?+ s) s, u, e3 |& G, x; g, q) z5 M7 I; Y+ z- C. J
        while(1), ^/ @& n! A* y& e6 z* y# T
        {! T& R) K# l) g, I8 c
                read_MSG_buffer(pshreRAM);
5 T% p2 U" Q/ o5 e1 A' N: O        }               
9 X1 O! U- |9 n$ Q: w}
0 a6 ~* D- e4 {: `* Y
# T- Z' T" y/ K1 n3 }' X" k  Gvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)- v: W# l3 a- z! E; j
{
; o0 L/ H% N  ]1 k        RX_MSG_PROTOCOL buf;
" b; e2 q5 G8 ~6 `, Q        ; u- J4 L4 e1 y9 L- B) a1 v
        buf.a = pshreRAM->a;
5 }0 J3 h% L3 x- D2 g4 \0 a        buf.b = pshreRAM->b;
+ s4 N( A# R- E9 \3 f2 s- i        buf.packet_cout = pshreRAM->packet_cout;
; W  ~  M* @* k( g2 q/ M        9 y6 R, ^1 n& C" A! y- G! ]
        if(buf.packet_cout != count_copy)7 i: M! ^4 A+ [: ^
        {6 G3 U- I) I* |6 |+ r4 c+ E
                printf("a is %d\n", buf.a);
9 B5 ], _6 k9 K3 ^9 B" M                printf("b is %d\n", buf.b);0 i2 H6 |8 p, N. N4 h$ n' c
                printf("count is %d\n", buf.packet_cout);  L6 @0 n! P/ h7 `2 ?4 E
                count_copy = buf.packet_cout;
* b6 `) `$ K' _        }5 h, M% u- S# A% J3 Q
        else0 m( z2 x9 B1 |" J6 u
        {; L! |  O4 W5 x1 q( Q+ p, y
                printf("No effective message!");
7 U8 h0 o% D5 g& O* w( [) P+ W: w4 C: ~        }
# ?$ J0 |6 S; |1 Q}  d: E) [& ]4 @; s; H

( G5 H+ U4 p/ z( z; X# x& O$ d5 o. d
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。' `, F+ q1 Q7 {  w3 d8 B
使用下面代码,对内存使用了mmap函数后:
# {& {# D( C) a% f0 N. H#include <stdio.h>
  j/ [, o( J( ?- `% a1 }6 O. n#include <unistd.h>
  q+ \6 {7 k! n#include <sys/mman.h>' D  p% T! D8 @/ X  J; K0 M
#include <sys/types.h>
" S4 X5 J3 ~5 B$ n#include <fcntl.h>
5 v- [& \0 T7 D1 A9 M2 Z8 y* t, b
: h: W1 `, f/ u9 F4 m  u#define SHAER_RAM_BASE_ADDR    (0x80000000)
7 i. P7 K3 S" J5 p2 m9 U* T; t#define SHAER_RAM_SIZE         (0x20000)   ' C2 e1 n2 z, ^- v

4 K: @% |# s+ w  rtypedef struct
# p, T9 g2 T+ W+ j3 B{
8 ]: ^1 ~4 f# i        unsigned int a;( m' b4 B; |4 Q6 y% Q
        unsigned int b;1 R$ s8 i: `( O* Y  f4 W
        unsigned int packet_cout;" _! e: F" D) E# z  J9 _
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 V, Z( W4 R0 S3 l8 M, e
" a# w+ S2 k# T: ~% X( o$ Q1 n; jvoid read_MSG_buffer(int *baseaddr);
  @9 X6 _% m+ Q) S) o- [unsigned int count_copy = 0;3 O  N+ }% `+ d. i+ ]
1 C" Q- w8 M0 @" t! p7 l
int main()0 m* i1 Z( d' C7 T- E: d9 S- \
{7 o% F5 z% H% z3 A3 O; H; v7 ~
        int fd;+ O# W2 h9 v; _8 s" d
        int *mem = NULL;4 W2 j8 @" b. m

7 F, M: y. Y: L. n6 _" C9 X        if((fd = open("/dev/mem", O_RDWR)) <0)' q; t% n8 p$ D  z# ^
        {
: D1 P" d2 U9 u0 T, h+ Y                perror("open error");
! M: |, g0 [$ n( I2 i5 i) Y                return -1;# K( g  P" R& ~% ?7 b8 W3 Y
        }
. b5 c& g& B/ i4 _& J) k2 _8 B6 T        
, n5 @( }5 ^  o, i        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);, ~, b2 u' _. Y
$ T8 W. E; S9 j( n2 @! z% F1 c
        while(1); ^1 {* O/ W9 g% P9 q
        {: C5 l  P% U! q4 w
                read_MSG_buffer(mem);7 f. k% `) Q& U" V5 R( ?; F* e
        }                0 M* |8 @1 O' O- z
}; A8 O7 I, B( N! K! [

- z: d; v( R9 v" i- |3 Cvoid read_MSG_buffer(int *baseaddr)
1 i8 ^7 t. C7 z/ a3 F0 S{+ L. f) Z7 J. q. N
        pRX_MSG_PROTOCOL pshreRAM = NULL;
  s, `* w& H; p0 d! b* z; k  s4 K
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;: @" _2 L4 r3 Z( F- G. i% p& p
3 ~! x: I- N; |. R$ U1 E& b
        if(pshreRAM->packet_cout != count_copy)7 `* }* O5 _& p
        {
1 ^8 t) N) ^8 b, s* z! g) y! F                printf("a is %d\n", pshreRAM->a);" `) f; f2 _# V$ `
                printf("b is %d\n", pshreRAM->b);
; [7 u2 B8 ~) _# O: a                printf("count is %d\n", pshreRAM->packet_cout);
( V* [" a! l7 t3 r, B+ |                count_copy = pshreRAM->packet_cout;
: z" b; u0 R* K, y0 `  U7 A        }
; S4 B4 |3 m/ C        else
8 P4 h( M7 ]5 G        {
" i! j0 T/ |! Z. L0 A$ r                printf("No effective message!\n");, @7 F5 p' t2 p& q
        }
8 y( J# U& Q( M) ~# q* S' v}
' u: |% T2 |( i
: z1 L6 n9 y- ]2 w7 }+ r没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
) `7 y! `% }/ c4 A# b& E9 U9 j+ I+ o" w8 v% b# A: G) d9 M5 [
( K! G5 P& D# q; L4 j% ?; l" t
2 _$ R/ \; O. |* ^

' f% j0 F4 I  w$ r




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