嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
( h4 `5 K7 T- r8 T' A5 l8 v; F, w
( |& B3 ^7 b% [  fOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>1 a; a8 a/ B' a- F9 N) Q+ ~/ ~
#include <unistd.h>
/ l# c. {) a( o) s- A#include <sys/mman.h>0 P& E7 _9 H) Z0 u
#include <sys/types.h>5 ?- ^  f1 k) g* ]4 m2 p
#include <fcntl.h>+ S0 h7 M4 c* _8 `- ]$ f( R

, T, x) d7 Z/ p6 t3 z$ G! k#define SHAER_RAM_BASE_ADDR    (0x80000000)   / H* {& A2 e$ `5 z8 X' }4 {2 V
- K' ~2 @" s6 J* O
typedef struct' `' v( n+ K3 z+ F! J, H
{
1 w) \: T) x  [& c) j& G. C        unsigned int a;+ }+ F; i; p1 J0 d* S
        unsigned int b;
- Y: R' b. ~0 Z& j4 V1 C        unsigned int packet_cout;
; ]3 e9 J* P9 P! _# H9 f3 w}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 r, @% ?, g* ~; C" ?4 ^* s/ M5 [" r2 u) _" e- d
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);5 F) U" r* h7 y  z
unsigned int count_copy = 0;
$ M5 J( T) Q4 c9 |/ Z' H5 D3 y0 c) a$ G0 i+ @  k4 L0 u! g- ]+ L, l  T5 ?
  A6 {6 f+ K& C7 f" Y  V2 {5 b
int main()4 A3 w2 ^' [7 }  D1 w
{
* u3 ~8 G+ D$ r- ?7 [+ t        pRX_MSG_PROTOCOL pshreRAM = NULL;
. O4 y7 f' }4 ^' `" s2 p( p# u, l$ p        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;  H2 ?. N3 L$ o+ O- R+ @
# r: |( L0 f. c
        while(1)
# {. E8 v5 ?+ j        {
. k7 r" [( |5 o                read_MSG_buffer(pshreRAM);
) [& k4 r7 Q# _' m6 p3 Y8 d( i        }               
: M* }7 n- ~: R" i$ ]}
7 W) ?2 N  f" M" ?, M1 y" _
0 c2 O# H/ |2 Y6 X* g) L+ L7 evoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)( T: n+ E8 }* D* l: `
{
6 H( D7 D* t/ p( g4 b1 l% D4 b( w        RX_MSG_PROTOCOL buf;1 M2 r2 j' B2 ]% I' @3 d5 {3 H
        " q9 y0 A3 H2 o( o
        buf.a = pshreRAM->a;
7 P& {) }$ l0 B6 |. i5 j# d        buf.b = pshreRAM->b;
! B) _- Z" V! N/ {5 ?        buf.packet_cout = pshreRAM->packet_cout;( U% T2 V; }1 i7 G; J
        , c3 v/ ?' q( ~( s
        if(buf.packet_cout != count_copy)' l: c3 l% m: T' W: `# O9 T
        {
8 b8 M  ^0 p9 A                printf("a is %d\n", buf.a);
/ W' D9 ~/ I0 |# B# R3 t  v                printf("b is %d\n", buf.b);4 v7 X1 O7 M: @. O( B3 S
                printf("count is %d\n", buf.packet_cout);4 E  p$ p! M8 g
                count_copy = buf.packet_cout;
: _" H! N5 ?7 a8 M* M9 m1 q  M" w        }2 p5 [& g5 @& S9 c5 c& J" W
        else/ c( T7 t& d3 n8 e' q( i
        {1 r! l( Y4 `( j. B; A) T1 i
                printf("No effective message!");
) [* Z" |" i! j        }
* ~  Z) g, V. U' F7 L" u}
: ~# i( G) X  u" Q; y% O# {, D" S
8 M0 x* j/ W" K" h* x* S
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
4 Y& \# ?2 m* t7 }. B' P) q使用下面代码,对内存使用了mmap函数后:# r9 J/ d5 a! u/ z
#include <stdio.h>
! z4 w: H: ~5 m- R6 H3 p#include <unistd.h>
  P4 q5 b1 g+ h3 e4 S#include <sys/mman.h>0 D! P5 ]9 y  y5 u1 U
#include <sys/types.h>) \' [+ \( g( u9 O
#include <fcntl.h>
5 F; W6 s2 [2 E1 F: A% X1 e( m1 q, J" s3 i, q% j" Y" l
#define SHAER_RAM_BASE_ADDR    (0x80000000)6 T5 x! C1 R9 q. {" U9 [
#define SHAER_RAM_SIZE         (0x20000)   ( d6 p' E) c1 S# j' m9 z4 d

5 g- d# `8 }5 C' ]) ptypedef struct+ @: y* S; b! x5 W
{/ B. _; a, m$ j) p6 Z
        unsigned int a;
+ O+ }; T3 x9 p& V# ^. z6 J7 P        unsigned int b;
- q; `. f' S2 O+ ]1 o! M7 Y% B& f        unsigned int packet_cout;
" w1 v+ L1 m. F6 q}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
* b& f5 ?4 ~+ |3 j- q' x' E+ c% D/ d6 I
void read_MSG_buffer(int *baseaddr);& p& D0 v8 n. P$ e3 h2 ~/ U2 ]
unsigned int count_copy = 0;0 ?( P" g% M  z" |2 R8 @7 {# v8 V
3 U, j. j: Z' q7 h. g: u
int main()
! R5 w- z7 b' m; S7 D7 D- W' V/ s{
# U" m! S! |+ u$ ~, N+ X: I8 A) O2 T7 g        int fd;
5 e$ w& }/ e  i6 u: i" ~        int *mem = NULL;+ k) r! q! h; i9 a
5 E, ]# ~9 `, s4 n* ~3 ?( V
        if((fd = open("/dev/mem", O_RDWR)) <0)7 u5 C- g/ E2 L1 D  [
        {
6 z+ F/ G; Y( u: b; }( g                perror("open error");& C" ]& O5 b7 W) |$ j
                return -1;
9 x" q2 e2 Z1 q! T        }5 o5 i" U! S# H# X! i
        ; A2 l0 C1 x9 @
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);$ f8 C+ s& P' X" ^9 V+ A3 I

4 ]# @. w0 h7 I6 U* f  @        while(1); P) y8 i' y: j5 J
        {. r# F/ Y7 j9 f4 q" \! p# g. P
                read_MSG_buffer(mem);# h" L" N4 g/ ]' u
        }                  {( h/ O3 A. I. b$ y7 y
}
3 t! H* T3 `& Q. S2 M
" e- L, N7 O: u) Nvoid read_MSG_buffer(int *baseaddr)
2 Z7 I' K0 o* h: U0 @5 ^4 G" ]$ ]- w{' l% }! Z; _* l1 w) Z
        pRX_MSG_PROTOCOL pshreRAM = NULL;5 |7 W# d6 k, R- ?8 r  H
3 M2 ^9 b6 i9 O6 V; B) N+ @# r+ t& F: d
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
. y" V, u! U0 h! r8 Z
6 @0 d7 B- Z+ d        if(pshreRAM->packet_cout != count_copy)  v  t: B, j- p5 f' z/ H
        {  E9 Q$ T0 F6 I) X
                printf("a is %d\n", pshreRAM->a);2 z. W4 o5 v4 H4 o; o" X
                printf("b is %d\n", pshreRAM->b);3 i+ x# X: g* @1 K+ e
                printf("count is %d\n", pshreRAM->packet_cout);; m5 h3 M5 d+ H, J/ c4 I: Y) h
                count_copy = pshreRAM->packet_cout;/ X( Y* a2 g& A5 @! v- d1 Z! q
        }: S, ]  T6 o/ j+ e
        else$ c/ G+ _6 F2 X8 u- e' U
        {' `* z. F, S% }, o3 [; J3 l# w: z
                printf("No effective message!\n");( @9 z; \" u% k+ `' }: U' h
        }
" X$ k( E4 h- C}
5 y" R- G2 p5 j. t! ^! L  R2 y  g; w' b: F- e1 g% q, l6 X
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
& M! Z/ \/ Z4 T, J$ O7 R$ Y, `" Q8 N( g' o! b+ {9 k: ~' J
+ t+ n8 k/ y! l2 V* L2 @

* L. v/ a5 N, h" I1 Z4 L* _7 h+ K% i9 q7 U& O8 X4 l4 g% h* Q- l





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