嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 " k! L9 W- D5 O9 ~3 r. v
# S* D( ?  h, p2 j' W' _7 C
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>! L; q3 C8 f1 ^
#include <unistd.h>0 ]2 W! i1 \# o7 j
#include <sys/mman.h>
2 ^4 e  _, I/ r: ]5 k6 B#include <sys/types.h>
' @3 |" F$ y  S9 X* W( {5 z) Q#include <fcntl.h>
1 ~' M+ O; z/ g/ [
2 [) Q6 {+ |9 ]# N! R& }#define SHAER_RAM_BASE_ADDR    (0x80000000)   
: f4 ?% P! Y; i6 o" J6 w7 `8 }" f, d, f* p1 c% {
typedef struct% i, m- P- G$ p- W5 `9 \! Z" z: ]
{
4 }0 S. p" }: J4 i9 L$ Y( x        unsigned int a;# }0 c: J# r& X6 q
        unsigned int b;0 N2 S1 s! a- y4 s9 s8 C) k& i- V- l
        unsigned int packet_cout;2 n- e+ o1 w# \4 i6 l& L
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;% T6 x! G, w& V9 a; ?" |! c
; a1 f. L' Y; B( O- ^4 U
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
  R$ v# k; h8 K7 ]) w; Gunsigned int count_copy = 0;
# P9 O  c7 a. Z1 a% ~4 c4 D! t; r/ q/ \: u4 j  u! s

( Q. C& r* c9 ?4 K$ ?/ G& l9 mint main()
$ e' \! R, K" V{
& ^& |3 Q* l$ T# \% }/ K4 j5 d        pRX_MSG_PROTOCOL pshreRAM = NULL;
  H$ F  X1 w$ J        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
7 Z# O/ A9 u8 p2 b. N4 `; x& h
* w! y6 }$ ?$ C: R; `        while(1)
+ s; k( K% w, E+ [        {/ O' i3 R. F# P
                read_MSG_buffer(pshreRAM);
; ~+ ~% [9 g& y' L4 S: a% N1 l        }               
1 Q3 @. @$ [" s" N: ]$ M}
+ u. R" c# \3 o8 h3 s% W* N2 g& I! i; _9 d
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)4 ]- m" V0 P# E3 j- X) f2 T3 t: }, _
{
  T6 j  i' c. d        RX_MSG_PROTOCOL buf;
- i4 d$ `* |. U% t4 p        
8 w: l2 S3 q, \$ ]2 o8 l) P        buf.a = pshreRAM->a;* E. R$ \! `# P/ \7 z# f! F) R' w6 J6 o
        buf.b = pshreRAM->b;
; U2 k( K* P6 p, ^( p        buf.packet_cout = pshreRAM->packet_cout;
- b) L6 @; o# I/ [        
: A% [$ j8 i% S( R1 z( I! N+ Y% l        if(buf.packet_cout != count_copy); ?$ x; V3 B: T: T
        {
# Q7 N  @/ P8 b( q                printf("a is %d\n", buf.a);
% m. }3 J! \. v: Y9 U                printf("b is %d\n", buf.b);: M5 E, N: f# F1 v; B
                printf("count is %d\n", buf.packet_cout);  x% n- Q2 J' c. @8 X1 z
                count_copy = buf.packet_cout;
8 s3 _; q- e1 X4 z- l0 Z        }
4 a$ C) S; T7 p4 t$ I1 E5 h        else  V4 B. m9 {$ {$ N* X
        {8 `: L7 ]  ?7 m0 k0 T
                printf("No effective message!");) R# P) {$ B0 n" \+ }+ Z
        }  e4 y( n2 l$ r2 R4 x2 ~! A
}2 e1 z" O# k1 }
: {/ D- S% R- i5 z2 D* {9 |2 C

9 J3 b" c2 e  Y但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
7 O  M) p; C; J8 _9 }使用下面代码,对内存使用了mmap函数后:$ Q* ^: ]- ]  i$ |( Z9 E/ R
#include <stdio.h>0 G! a" `/ y: |) O" y4 h' W* {. q
#include <unistd.h>, b/ s; A/ I- b" E8 f
#include <sys/mman.h>( T! Y5 t6 |9 x, s
#include <sys/types.h>  `# q- N) c) z1 w' g
#include <fcntl.h>
" E9 o5 X7 q" n2 |
& H8 \, O0 r: K$ w6 b#define SHAER_RAM_BASE_ADDR    (0x80000000); R" k( m7 |" a& n% {( v) K
#define SHAER_RAM_SIZE         (0x20000)   
3 E! r- Z9 g# Y8 X% X0 G$ l  h' Z; @) I' _
typedef struct
. G0 [8 V' o0 U( ]! v! @/ X/ F{7 g3 |& \# `6 }% m
        unsigned int a;
( Q* |$ i7 N% d% H# Y/ N        unsigned int b;
' B6 C: R1 r( K  M0 j        unsigned int packet_cout;
0 l0 V3 Q* S# T& v, m  K0 {6 e: `}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& U) g( h) m* r7 m' T
1 s, H6 m* t9 J. a2 w7 bvoid read_MSG_buffer(int *baseaddr);
, L+ V' c1 U+ L5 q6 qunsigned int count_copy = 0;
% {; D. x, ~/ v- u' E2 _8 J9 f
; D  f" _7 y( [& y9 \0 rint main()
) o: S) n1 t- {{  s" q8 }' U& C% r, J
        int fd;+ c8 P% _6 p* x0 S* q  K$ z2 a
        int *mem = NULL;, W+ b6 R# g+ l' [% l

% t: Z3 w, Y7 x. |        if((fd = open("/dev/mem", O_RDWR)) <0)
9 {: `+ v* C  G& L2 Q- ~5 z        {7 U. z- c+ K3 C) L+ R  ]
                perror("open error");
9 o! y% \; x, {0 x                return -1;2 S- F- a& u, D( x
        }3 B8 q" b# ~* o- P7 o
        
9 @+ i$ F' O6 e$ J        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);: k( o! D+ A8 Z7 Z5 [

. o" s; X5 u% V8 c( l6 [        while(1)4 x6 q; y$ D0 i* K3 q5 J5 }/ H
        {, @3 \; A% V7 ?( e7 D
                read_MSG_buffer(mem);
: t4 U( ~* }+ b' M" ?  E        }               
# W" ]* h+ Y' R/ k}! {0 Y5 R: ^, v' K% K9 l" c
# i( d1 i- `2 Z" u0 Y1 T7 x! l' o
void read_MSG_buffer(int *baseaddr)
4 o; o' d+ o3 C" {  E/ L{/ |4 L1 ~  t9 T1 c9 C- }
        pRX_MSG_PROTOCOL pshreRAM = NULL;4 n; B# N; K3 }

. `, t1 S  L" L2 @0 d. ?+ E        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;& x5 u  c; M/ G$ O
5 T+ c' n- h! j& x$ {  d/ r$ e' R0 `
        if(pshreRAM->packet_cout != count_copy)- l1 |! I4 l+ p. K* B2 m
        {
6 A: ^/ J# n% U5 R. x8 P- ]                printf("a is %d\n", pshreRAM->a);( U3 G. b" ?) E
                printf("b is %d\n", pshreRAM->b);, b7 k  Y& {; Y- F* \! f& s3 M+ W
                printf("count is %d\n", pshreRAM->packet_cout);% Q2 u7 T# U8 q9 ^2 ^! B
                count_copy = pshreRAM->packet_cout;+ ]- a9 v8 Z3 F# k" W
        }6 |, Y* q% p3 @/ D
        else
8 u% j5 X! }! T" {& Q$ ~, \6 K9 J        {8 f# S9 G/ p+ n* w
                printf("No effective message!\n");
7 e( X5 N$ T! Q/ v7 i: y        }
! A" A$ q! X; r; a7 W' i. e$ `  E9 r}8 `9 T: b' [- D5 H5 e

3 F- r( d$ C* k3 G  f3 ^6 {没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???4 y% z# K; b2 ~* b! L

) ?0 Z) n: j; ?
5 D( o+ @4 U0 d, K$ b1 [/ b- u; u" {+ _- F/ z) [8 r

: b* {* N3 o& s( v! G' i+ `




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