嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 & `, R- G+ p- U& f' k. k" l
, ]7 m! V! T0 B0 p! B9 y. N
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
6 O2 O; o2 k; o" F* _#include <unistd.h>8 Y  N" R9 D% w& X
#include <sys/mman.h>
5 B. C* f' p3 w  ~- r#include <sys/types.h>$ i6 ^/ C, A$ c* M3 z* l
#include <fcntl.h>; _/ P% N* b; u1 q& `/ m1 y4 n
6 K/ r; w  c4 ~0 i
#define SHAER_RAM_BASE_ADDR    (0x80000000)   9 [0 Y0 W5 {3 S' G2 `8 K
+ }+ q6 B/ W9 l7 C2 [* |
typedef struct/ k) N$ N$ _; a1 {5 G
{% k  o4 H4 N' A9 i# `( H
        unsigned int a;
- ~6 ~' y- m% }" R+ F        unsigned int b;1 H3 A% o0 x( \% I8 G! O# [
        unsigned int packet_cout;. W0 u# b4 Y2 E5 Z. o
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;" Z3 L' H8 {, u; h: s$ }

( e/ f: i5 e' r- D" ^! _void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);5 a* Z1 w2 k- Z% `- h
unsigned int count_copy = 0;( H5 d3 q  H7 [5 Y9 y6 W3 Y4 W) b
# g0 j- I6 x3 E

9 y5 I$ J+ |/ Z3 kint main()5 L* F8 `4 S+ W" Y% l/ \$ c- n( ~5 W
{4 d4 o0 c: W: Y. o. \4 A) r
        pRX_MSG_PROTOCOL pshreRAM = NULL;; H" ^+ m# i6 ]5 H' g4 x" {" j5 l
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
, }5 U+ T( b. j- u& u
4 k3 e+ g2 t, I. D# g" h: C        while(1)
; v+ D  V3 w- h# ^4 Q' |1 }        {
% X9 _- ^4 p7 m2 t" B/ `! r0 \                read_MSG_buffer(pshreRAM);
/ M1 s8 |3 A: v7 w7 ~$ M' {/ Y) }        }                8 E5 y; W6 A6 w$ C  O, i$ f
}
, m( v& B" }/ K+ E& S" n/ f4 l, b7 d/ H+ {; E; D/ i8 q, m
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)+ s  S! t5 i7 y% D# t3 ]6 U+ M
{
, ~0 ~/ v$ z) N  ~        RX_MSG_PROTOCOL buf;
) r3 B0 C) h/ F        8 r; `/ L' D. K8 H. }7 x. s0 m
        buf.a = pshreRAM->a;
3 I2 A# T4 U* B* k( d. N        buf.b = pshreRAM->b;
  u, g4 J8 I' z/ x1 r        buf.packet_cout = pshreRAM->packet_cout;: s9 A6 R3 l( l5 Y* e
        
7 m( N8 H1 l6 H$ S7 q6 p( ^        if(buf.packet_cout != count_copy): E1 Y5 ^. j) t# A7 m% @' p7 D
        {) k4 s# j  ^- s. l/ |. A
                printf("a is %d\n", buf.a);6 A- }) h3 O8 T7 r! x; t! n8 z
                printf("b is %d\n", buf.b);* X: c4 C2 x4 W; [* ~) X# V2 r/ w+ S
                printf("count is %d\n", buf.packet_cout);4 ~; W9 N' }- ], q2 f
                count_copy = buf.packet_cout;
. W6 K% M$ Q9 F' E& }! E        }* m* {3 K3 z! K% G2 q
        else$ r$ [0 b$ q6 c- G5 Y
        {
( f5 A2 v' b  E6 k" U                printf("No effective message!");, W& C7 l* v( d6 N7 H- G$ [  x
        }+ G5 j; E# [% f# `; k
}: C4 b* w& {0 o9 T3 w7 }
# O0 z2 v! r+ P
% s5 U' V$ s) f# S# U
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
$ D/ k! {( j7 g! P6 j& U2 ~* B使用下面代码,对内存使用了mmap函数后:
. f0 y- f! f! }#include <stdio.h>
8 M& S2 k2 Q! r8 p) ~#include <unistd.h>
3 C% E( p+ u2 e: {7 ?1 K  C" ^#include <sys/mman.h>
7 t5 t. C8 v& c! |2 }#include <sys/types.h>
4 o! p$ U7 x# `% p4 L8 H! p; u  R#include <fcntl.h>
; q+ F5 v: ]% ]+ Q+ E
- ^; _4 Y. s- X, R, e#define SHAER_RAM_BASE_ADDR    (0x80000000)+ m* j) q4 [/ h  W" j- n5 m
#define SHAER_RAM_SIZE         (0x20000)   $ j! N  |+ Z/ ]2 T* i

- u/ t; ?8 `2 g) `2 Rtypedef struct
$ C: v/ h# `4 M, h! O{
( S4 R$ }8 E3 E        unsigned int a;
! ?& i/ m8 C# h5 r& {0 |5 l        unsigned int b;
5 D5 U6 |5 \3 p: a        unsigned int packet_cout;
  k4 o0 b  k7 e% w, Z' [2 l}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;6 l, z3 g2 ^% \9 L8 ]+ K$ j

' m; R: U3 C, b- n9 gvoid read_MSG_buffer(int *baseaddr);
4 I  H8 R  w: ~' e" Bunsigned int count_copy = 0;+ |0 R7 @9 _, ^+ X
/ v! c$ r" ?) L! _! a
int main()
* h- P8 j. T. J+ z0 h6 L$ d0 [{
) x: X2 e1 H5 b+ Z        int fd;
+ T" f  v7 d$ e% H+ X        int *mem = NULL;
: G+ J5 f% B" V3 o# J8 y; M, `. g; w  t5 `+ `
        if((fd = open("/dev/mem", O_RDWR)) <0)6 |8 Y: q+ G! ?
        {
/ o6 T8 \4 E# t2 U7 x& @" f; O                perror("open error");
4 B# U8 {9 y/ O) l( g  [9 O3 B                return -1;0 e0 J3 D9 n, t0 I( g
        }  G; e( T3 `% ^" s, A: c  C5 o
        
1 n/ `' v* D( H! i! _" R7 K- @/ M        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
5 w4 h; T' g( I# }, b8 \6 M
, e6 c/ r# R. F; B1 w1 `0 W- X2 V) t        while(1)
/ O; a" r1 U& P8 ~        {4 B0 w# i- `& F( o7 l2 |
                read_MSG_buffer(mem);6 F& l  X6 T% E  w
        }                , D+ D) ?( x6 V3 p7 X! b1 F! x- w
}8 p" J" Q4 n9 r* C+ [. S
/ r/ n; }( P0 N. w, |$ S- C2 O
void read_MSG_buffer(int *baseaddr)4 a# i% _0 S2 G
{
4 z& [  ^! S7 ?- l  W5 S% l1 a1 @( ?        pRX_MSG_PROTOCOL pshreRAM = NULL;/ y: B7 k7 Y/ |( T; e& g

. B+ _4 b' N0 f- X1 M. R        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
9 {2 [, g' w+ `+ \) e/ p2 G3 S- E% l2 p! Q, o
        if(pshreRAM->packet_cout != count_copy)/ u% Q$ |* {- F. h6 u# R
        {
% X0 h; o' W3 G                printf("a is %d\n", pshreRAM->a);
; b5 s1 V' r. M8 f/ [7 ?1 [                printf("b is %d\n", pshreRAM->b);
' n1 |* N) M8 `2 B/ ]$ t                printf("count is %d\n", pshreRAM->packet_cout);
  U' b/ w; Z3 s$ r2 O/ L                count_copy = pshreRAM->packet_cout;8 {6 q! ]; x( `7 }- L/ H
        }
; P* ~) |; _) R  s& R1 H  b# `        else
1 r0 H0 [& }" }7 I1 n        {
! k( U2 o+ y: ?% v) `                printf("No effective message!\n");
- w( }* Q& ^5 B3 @        }+ ?: Z# S: @$ W( N
}
: x9 P  K5 s7 o4 _$ J$ D" B( C' D% W4 g  y* F
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
: b0 H( m9 V2 o1 t4 S3 Q0 E2 W# W% n: ^

! m) ]' S! r# H( z( U6 n* n: {3 s! _" G+ O

" r$ Q" M: V0 A+ N




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