嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
, {1 F: ?: i' k- ]( o, i3 p8 [* [- J! e' }
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>" \  }% Z9 W% y4 H& J8 p
#include <unistd.h>7 ?, X3 n; s/ D: P! r
#include <sys/mman.h>7 L! v3 Q$ P3 j; m& e0 [% x& J1 ]$ a4 ?
#include <sys/types.h>
) D/ A/ a2 F. t& c5 ?/ n#include <fcntl.h>
8 |7 H9 O) g; u5 F6 l. K7 N# J) t# n' I6 Y+ t7 r0 e
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
" `5 a2 R$ \/ K9 a+ a5 O4 y7 p8 \: Z
typedef struct1 I. k& q" w9 o' d: ?) r: j
{
4 \. ]! }* n, C& ~! R6 A' b  E        unsigned int a;: y% K/ @/ r+ Q6 {2 j
        unsigned int b;, y. e% M, W5 r+ f3 ^
        unsigned int packet_cout;
( O% S$ |1 z; `! B" R}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; N% ~6 Q$ @  C; L& @: T7 X6 I  S  x7 ~* A
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);+ p* p1 r* z/ d$ P5 i% Z) R/ L
unsigned int count_copy = 0;8 m  M! L( Z' l
% F! q8 \; r3 _- P! y
8 x$ }4 |& ~" g$ X) \$ X
int main()4 o$ z0 ]1 |- Q( n8 I0 r$ h
{; ~8 C' S& ~) {5 ]2 G
        pRX_MSG_PROTOCOL pshreRAM = NULL;* l( O* O: f6 P& c% H5 ?& l( j& a
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
, ^. b$ g2 _& ^' O( E  t& M2 C$ A( I+ J0 y/ ?
        while(1)6 C) Q( T7 W5 y/ a6 y
        {/ @- P8 l; n2 }8 N
                read_MSG_buffer(pshreRAM);! V7 ~, K- V' M9 H* ~& x
        }                # C5 U2 d! ?5 h# @+ Z
}
0 y  z& H( e# k$ L
, {+ e- e/ @  I$ x+ Y- h" ovoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)' c1 A, P& L$ }+ U8 u& B0 _2 {
{) W. Z" z4 @; ]* }0 t1 S
        RX_MSG_PROTOCOL buf;
* \6 l8 M8 a& Q' m4 B( v        & A# C6 i7 y1 v2 F+ F8 E+ W
        buf.a = pshreRAM->a;/ a& b2 ^. |  r
        buf.b = pshreRAM->b;
. h: @1 ^8 G) @        buf.packet_cout = pshreRAM->packet_cout;- H: A; A& \' _+ |
        
0 ?2 M" j' m% \7 ^, s* R( o        if(buf.packet_cout != count_copy)
1 ]+ J% a( z% p/ W$ `& V  n6 d        {
" \. y( K! `5 c5 f3 R5 G                printf("a is %d\n", buf.a);( L" f  q/ X6 b8 V' D: \0 _  o1 c
                printf("b is %d\n", buf.b);
7 v  r! P& z6 R( M1 k                printf("count is %d\n", buf.packet_cout);
% Y' w3 [  ^& U9 `, s7 W, R                count_copy = buf.packet_cout;3 C* y" ^0 m3 O3 A3 J7 Y5 Z
        }
$ u3 p9 S# h; r$ J3 q4 P        else
% m+ a1 T+ q& A0 }3 C8 R' v* s, c        {" I  {5 n$ Q! j* D+ D
                printf("No effective message!");+ n9 l2 r+ ^# a- U
        }
: v  n( ?+ K' Q; m  Q}) w& x. E4 E9 d6 y) e

3 p% ?' y9 B: f
4 i% s4 y% v" }  j! `$ [但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。. u7 a! o- E6 v/ _# }+ ^: X: v
使用下面代码,对内存使用了mmap函数后:) X' d. D8 `) o% a
#include <stdio.h># x: l- Z6 f  A& x+ M  x- u4 [. `3 T
#include <unistd.h>4 }/ d% ]1 ]% E8 G- K) s
#include <sys/mman.h>
* g- w& {+ F( p+ O; D#include <sys/types.h>( A7 K' l1 _  x) g" B  ^8 }- X1 n# X
#include <fcntl.h>0 X  B2 i# a2 z) }6 _( u2 w
- t& ~/ O5 [, P& [
#define SHAER_RAM_BASE_ADDR    (0x80000000)
# Q! o, J- t4 K  `) j. n( |% V#define SHAER_RAM_SIZE         (0x20000)   
& a) D+ ?+ b( m% m
9 [& W; j0 Z( d( A7 etypedef struct
& L* V0 B: L# V/ O' p: m{3 f4 i: O8 s2 F! O! A% A2 K2 ^5 K
        unsigned int a;
* Z8 ~. h# ^1 E0 d9 U        unsigned int b;- _/ V4 x% _1 u0 r- w# o" O8 d
        unsigned int packet_cout;
1 M. C; Q0 t/ k7 f/ d: Z+ O: H}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 E  q. j+ _+ Z* a% M' U& R/ V; J
# z6 y0 F" n0 @9 e9 Y" K1 \' \void read_MSG_buffer(int *baseaddr);5 V" w& v3 T9 B, \' R
unsigned int count_copy = 0;
1 d! r% e) \) b8 ]  Z. |+ k! s1 I0 V
int main()
- {3 J) I" L8 L" L& H" R{" H1 M8 R4 z; `( e
        int fd;; T6 q+ U; Y$ n3 B! e
        int *mem = NULL;
1 `5 T" |; v9 P
. y7 o7 E7 V- G7 s! D( E# i4 D* {, h        if((fd = open("/dev/mem", O_RDWR)) <0)% E" [: T* x, K* o( ]4 W4 |
        {
+ e8 [6 Y$ `3 _7 w: B4 ?                perror("open error");' F' @& g  q* q' Y2 j
                return -1;8 S) R" f* U- i$ E% y  p
        }- F+ x1 q$ P3 j' J) M
        
7 B' W$ h; B3 Y. X  o+ m, N        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);" k6 c3 k  ?; N7 `$ Z% A

6 R. D, K, m  F7 @        while(1)
: z: y( S3 d; T% t        {+ Q% S2 N, H1 |' w% F5 d
                read_MSG_buffer(mem);- m0 A4 w  g/ h+ Z& x
        }               
/ G/ q2 x4 ?# q2 Y/ B4 c" o}) Z8 o$ r1 A! V& U# E, S. z

+ O  f! |7 m. X% _void read_MSG_buffer(int *baseaddr)' U6 _1 F  m- X% ^- X
{$ g; `9 V, l( @6 K5 i
        pRX_MSG_PROTOCOL pshreRAM = NULL;2 N: U! L) O0 X" \' z  T$ K% y
; y# u* g: F+ b& C
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
7 l6 j- i' b3 [: H8 i1 S0 q( X+ W" q" q  h$ Y; d
        if(pshreRAM->packet_cout != count_copy)
8 S: `1 s! }# F! w& g) P  P        {, o# l1 {4 L- b( ?2 r
                printf("a is %d\n", pshreRAM->a);$ E" O4 J4 R% Z; H) N! \- J
                printf("b is %d\n", pshreRAM->b);; D3 T& y* j8 D) {: s
                printf("count is %d\n", pshreRAM->packet_cout);" Y3 }7 d* U$ M9 S6 F. i
                count_copy = pshreRAM->packet_cout;
3 G+ I% l6 J/ o8 H5 Q        }
& ^' M' Y- `. E; J( Z( ]; Z. D        else
3 \+ t3 M; ~1 Y7 s6 h. G6 h        {
3 @& V: x7 L4 Z2 C- T                printf("No effective message!\n");' j$ n5 {! N0 U# q9 I
        }
$ R6 F/ c& `" T. F8 ]2 i! H}
4 U0 i2 \' N  U( O( g
- b0 }$ I8 y" w1 [没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
  h& J  q0 v1 n. y) {9 _& _: b+ \1 c
, k* F4 Z$ X* |4 Y: i
- s: _7 U" P5 j6 T
& o8 V" ^1 T  o8 |/ I; H4 O0 F% a9 V2 `: C% U$ f1 G





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