嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 6 c; m' [& u1 q

- v& j: V3 d5 nOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
0 q8 a% D6 |  R8 H/ }  A6 o#include <unistd.h>4 [- X0 M$ A$ o3 z; v3 F
#include <sys/mman.h>
2 @2 a! R: v4 ]. x& f2 ~#include <sys/types.h>
3 p+ a) ~3 A' }# [5 P#include <fcntl.h>
* s) U  H7 v* {  n8 s" R, W2 P7 v! z5 V* ]
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
9 f9 h+ k$ d& s: I
6 @( X1 q9 I  E8 [typedef struct
/ a7 p% W1 o) v$ U% u{' o& _) h9 D  H. E
        unsigned int a;5 L( U+ p4 |. r3 d
        unsigned int b;
1 |, s  a% z, L5 S: v9 n# O        unsigned int packet_cout;. m8 Q" A* J' ~& m, o& a
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 z: O, i/ i& i0 A# U! l7 x5 q& _
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
5 i# d- e+ S1 R1 |; Kunsigned int count_copy = 0;) D; H0 t5 {% S) w
; M- ~- L! E  T% x8 u

$ t) o( w2 m1 Y$ U2 K9 Qint main()
3 A  y' P# C! X: D: e{( @1 R. g3 u0 q% [3 D: b
        pRX_MSG_PROTOCOL pshreRAM = NULL;
' c0 f+ @: a9 m& I7 b3 @& c        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
$ v( b7 _1 c' E. n; L2 f9 h
- y8 b% r1 A0 d7 o$ D        while(1)
4 H- ^% {6 X' \: P        {4 Z" S& o* w8 W* \+ k9 f( \" T
                read_MSG_buffer(pshreRAM);# |" F  ?7 U0 |$ B+ i" N
        }               
1 X+ H- p( C) |8 S' ^  J; `}) A4 m  p- ^: Y1 X

; z  E4 a; U! I% Nvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM). ?# M. O) o8 [2 p8 T* a" j
{. f. k! l9 y4 B
        RX_MSG_PROTOCOL buf;
; ~" h3 B* F; [        5 L4 b$ ~# _+ ~) q/ q
        buf.a = pshreRAM->a;% p2 x3 q; i# F$ e# G2 r) r+ w7 m
        buf.b = pshreRAM->b;
" t. K" R! J* z        buf.packet_cout = pshreRAM->packet_cout;: S9 l9 u$ F; [! F$ F/ U
        
" [! Y$ x4 B0 G, n- ^/ g1 R  ?        if(buf.packet_cout != count_copy)1 w2 ^% \+ V9 d' \) x  r
        {! w6 J7 a. ]9 f, X: c8 Y
                printf("a is %d\n", buf.a);
, _( y2 `& W; E( ^0 R3 T( d                printf("b is %d\n", buf.b);4 ?9 J6 E( R5 i- u
                printf("count is %d\n", buf.packet_cout);) Q* Q" h8 X2 U+ e1 `: G) a  Z
                count_copy = buf.packet_cout;6 Q/ I; @% A4 O- @* r3 w
        }5 W2 L" R( F) C& {; Z
        else4 D& Y+ L, m. Y4 n/ i2 @( k" `' y2 B
        {3 `: C$ H1 Y; T- |6 N
                printf("No effective message!");- r7 C% r  S. i5 l/ j6 S# X) [
        }9 q$ B1 D% f+ k+ j5 i7 c) s
}
9 R" G: n* }' {! O* B7 _3 J2 Y1 J* j6 _1 J  X+ d5 z5 H+ u" \. i- r

: ]! P: I! o8 f1 @: ~+ p4 A/ I但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
. B! I$ d5 W" B# w使用下面代码,对内存使用了mmap函数后:
' Z# `7 a1 X5 W2 k! W' }#include <stdio.h>
' V- z/ l  Y/ T#include <unistd.h>
) [5 H  G) b& M7 N#include <sys/mman.h>
8 g, C/ ?7 _. q0 P9 M4 U2 {: n7 U#include <sys/types.h>0 v5 h" W: c$ \8 N8 m) c) \- f
#include <fcntl.h>
& p  Q% G6 |$ |7 v6 g! O1 G
! S* }! ^( F+ M4 F#define SHAER_RAM_BASE_ADDR    (0x80000000)6 r5 b4 `( }6 Q7 A- z
#define SHAER_RAM_SIZE         (0x20000)   
! ~- c( ]  q+ Q" Z0 J3 L: I) A: D( k8 f! H3 ~8 i# W% `1 w- W
typedef struct$ u4 L! s/ p5 }0 O- o$ ]
{
9 k  `: W& c+ ~. _        unsigned int a;
: _! h. z# A7 g9 M        unsigned int b;
0 o! R: p  X( d& D( P        unsigned int packet_cout;4 L3 K9 l5 @1 i0 A  b7 v
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 c% }& T( n. G! A' K9 x( D# @1 x2 ^: H: i/ m
void read_MSG_buffer(int *baseaddr);
! H! w8 w8 S. s8 _unsigned int count_copy = 0;9 f0 s  I* z+ a  b
8 N* i) L  c& P" Q! S- R
int main()
1 x( ^+ {1 N7 h8 [1 A2 T{2 f+ D) t# U" r0 _, j
        int fd;
& ]1 ^1 v2 F4 h8 {9 `9 Q9 ^        int *mem = NULL;6 \' [0 `1 j7 a1 m; e- @# C5 F
# v# f9 D! ?- `
        if((fd = open("/dev/mem", O_RDWR)) <0)
* `1 _( Q( m- ?! u; _        {
7 f' F+ ]# m9 I; n& R                perror("open error");( R# @: @; |* N" n
                return -1;: ~" W5 Y' P$ f
        }% U& D% m' v# |1 k; \8 t
        
- e7 u0 {7 S1 N% A% E8 `        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);& x9 j) p. G; K5 R5 _5 J

3 n4 Y4 A/ D& g; W4 k        while(1)
: K, z+ {5 W. q( T; y        {
+ \7 @) j) X" A8 U                read_MSG_buffer(mem);, {6 E; j$ {2 E8 U0 c: T2 N. d
        }               
' H! I, E* V1 v}3 Q, Y1 f$ b  o+ I5 O$ x
( B4 o3 n' x" ^
void read_MSG_buffer(int *baseaddr)( h' q1 T: w' O$ @( e
{
& P- v+ `& m. i6 l" W* J! P# I        pRX_MSG_PROTOCOL pshreRAM = NULL;9 {8 y: E$ z$ p  j

+ T- {6 @0 q2 v0 S, H9 j$ s        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
' N1 `$ I- e. G: d  {% @
% K: i/ w' X4 \" n# ?! N2 _7 ~5 J        if(pshreRAM->packet_cout != count_copy)
  E! L; {" z( |3 @6 T! t8 q        {
4 K  F/ ?3 i  N  P                printf("a is %d\n", pshreRAM->a);
1 E& b& y4 S. x4 J1 G7 A, M                printf("b is %d\n", pshreRAM->b);
: _3 m; |* B% z/ e) ]  y                printf("count is %d\n", pshreRAM->packet_cout);- D; T( G+ s% m$ m5 l0 `; s  x4 o  v) R# e
                count_copy = pshreRAM->packet_cout;0 C+ v  l, {$ e+ n2 h
        }9 Z& @, ]" x6 {7 C
        else
- Z; S3 |, D% A& Z5 V) o! r        {
5 ]1 G* K) K, w4 _" g. u4 N                printf("No effective message!\n");
& R7 \3 k: @/ t2 s0 t+ o) v        }% f5 k% o4 o* m$ |' N) [  `+ ?. h
}
& `( {% ?+ ~' L5 W/ ^# {  l1 z% ?, S, y; f! I2 `
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???6 r/ D/ x& u2 A9 ]
3 q5 e, k; `* {
" W$ n, n' v. Y; P2 F

. A+ C: U4 S3 G
- ~2 I, U: i& Z6 I6 n




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