嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 $ ^7 t$ I. m! K- F

# c6 Y( g' O  D$ z" Y  wOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>+ t' b2 S6 m# f+ h# f: @) o
#include <unistd.h>) p$ ^! b+ V- j6 P' w$ K' X4 a+ H
#include <sys/mman.h># ~, L; i. f+ U
#include <sys/types.h>1 S# R/ p; d1 O6 S
#include <fcntl.h>
' w1 z. j8 l2 j/ x5 D! q, E" N  z+ n& L
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
$ t9 [% P$ {% d4 z0 N3 r5 h/ h- A8 T5 I8 ]$ u8 N! ^8 v( v
typedef struct
( b0 S( M: v. I% D* T$ G{
- ^$ A. z; m* w, f6 W        unsigned int a;8 w' }1 @" {/ J
        unsigned int b;
1 Y* Y! X& t3 ]! G: W        unsigned int packet_cout;
4 D3 u9 ^, p9 \/ v}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;2 E6 F. M, q9 J% o! g

: b$ d' z  }2 u, v' l. Ivoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);) x, u1 M' p5 Y1 V
unsigned int count_copy = 0;
2 g& X) i7 B. M+ c) S
- v! v1 _. {  S" x* U8 Q" F- c/ Z2 n" z3 l' s! }2 u2 I; _  C& c. [6 P
int main()
- g* S6 o/ s& a1 P2 Y7 s{& b9 ]' z& X1 u( d$ `8 Q
        pRX_MSG_PROTOCOL pshreRAM = NULL;8 A+ O7 A' K7 z2 E' }
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;, Z0 B7 j+ D2 G. M* q

3 t7 d" U# P9 ?2 m7 o# ^+ p        while(1)' o% @# M' G3 P! ?' H
        {3 c. I& J2 U9 d1 o6 Z
                read_MSG_buffer(pshreRAM);
( {5 _, Y, F  `        }               
0 _! d! `8 h0 H# h6 m}0 A& d" C0 q" o/ o4 N& U

4 Q/ i( `$ J; G3 |( j% Q0 Nvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM). @- A; w4 K3 a+ P
{& ~# a7 \, M# |. m
        RX_MSG_PROTOCOL buf;# {4 E7 |; V' \$ z
        : p" b9 z' ?3 T+ R  L
        buf.a = pshreRAM->a;
! Z' o" p0 _" ~" K4 x  [1 V+ u! ?$ _        buf.b = pshreRAM->b;' `% e/ b( s7 J6 m1 }4 w( j: U8 K7 d. z
        buf.packet_cout = pshreRAM->packet_cout;0 K: U0 a: S  j( s
          U: t3 f* G2 A  z5 X* J$ c% X
        if(buf.packet_cout != count_copy)
/ s2 ]8 [; b1 e; O        {) w7 B. p! U! i0 |5 i" M
                printf("a is %d\n", buf.a);
  h. c0 @5 I+ w1 Q& n3 ~                printf("b is %d\n", buf.b);9 T+ S" j/ i2 u) D( W# z
                printf("count is %d\n", buf.packet_cout);; v3 S0 R  G- x+ j9 V
                count_copy = buf.packet_cout;: t/ C2 g# E) g# O5 {) D9 M
        }7 l$ A' v6 a. I
        else8 O' B; V* e- j
        {; G" D4 C- P, Q# g  l- A
                printf("No effective message!");* w; O5 S+ f5 f- T  N/ O' Z
        }
" Z# ]% O1 f( t}) b1 D4 w4 h7 K& y

6 M/ U; z2 a4 T4 l& p. Q. j5 \3 U+ c9 f# `# Z7 U8 }/ [
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
7 h. T* s. _4 `3 B; Z使用下面代码,对内存使用了mmap函数后:7 o* x; z+ K2 e6 ^/ z
#include <stdio.h>
, Z4 k3 b) _- h4 G#include <unistd.h>
% Y3 y; _4 F5 ^( S1 D- ?#include <sys/mman.h># L* V' U0 F& a: L$ t- q! p
#include <sys/types.h>
2 E6 q  v$ e' B' ~5 g#include <fcntl.h>( l4 L" m7 I6 ?5 R7 d! i$ X+ y

& Z' v  L) I- Q& E% e; R: }#define SHAER_RAM_BASE_ADDR    (0x80000000)8 E) {  a$ i- ~
#define SHAER_RAM_SIZE         (0x20000)   " x; v( L+ n" w
/ E1 `8 R. @5 W9 q
typedef struct
9 k  w+ j( {3 r{
5 U5 m4 K7 X- X; b1 L: g$ k5 d        unsigned int a;
0 _+ _! Y: ^. A; ~' Y( L        unsigned int b;0 X* `3 V- ^- E* `" Q% b
        unsigned int packet_cout;9 v$ `. P$ g! _. f4 u3 \* }9 k" ^
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;* J6 e' A6 @9 K" V# v0 P

, h( Y- L7 ]- {0 y3 Z' avoid read_MSG_buffer(int *baseaddr);
) U* ~0 w6 N% D: d8 Punsigned int count_copy = 0;& B9 ]7 E: D+ J& \( F- [  w2 C
& T& M, D. l0 d" X: S4 o
int main()" z# b& j( Y3 W+ R0 F
{
/ z9 H6 o, |+ w. q( a. @        int fd;# b. z! q+ T, n  w* v- S+ G1 j
        int *mem = NULL;! o* A- Y, q, V$ r: p" S& T
. Y0 p/ E& V' y- p+ J  a
        if((fd = open("/dev/mem", O_RDWR)) <0)- p+ g- h: u0 J1 h; R  J
        {
6 f' ^- L: I7 b: W                perror("open error");
! G- L. X2 I6 k) p0 S2 C# }5 i2 L                return -1;+ `6 K% ]- H4 Z4 y* C; d8 ^# X1 I" O
        }
8 `% X* ~/ x6 T3 ?" @& G% ^        
" w1 s3 i( v5 B- E/ K1 H; D        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);) N. ~( ~1 f. h% h! }3 b' z
2 {. W/ W0 J+ u5 Y: {# q7 V6 L
        while(1)
5 Y! M" m. z2 W$ d2 F/ ~        {
9 j9 l% ^& b4 ~$ [. ?                read_MSG_buffer(mem);" d8 ~, I0 S& d/ W, k6 N+ z8 \% H
        }                8 i, X: c/ I, e
}
, g& e! A+ Z! q8 l9 Q! Q" @8 J2 O& L* r4 Q, `, B8 Q8 ?
void read_MSG_buffer(int *baseaddr)! j; @( ]1 s, l2 R- K! S
{! p. _  E3 w- Z6 e# F/ A7 A
        pRX_MSG_PROTOCOL pshreRAM = NULL;
( |% }3 K. h0 e) X* C; w) A2 C
9 E; s+ p* I, y/ X/ [. w        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
& I* |1 r5 a. }9 t# O( j* k0 C+ E
- D, h! A& Q" }4 }- T7 D  I        if(pshreRAM->packet_cout != count_copy)8 t6 p% |% m: \8 Z7 d
        {9 \+ @  M! c6 T; B( @* H
                printf("a is %d\n", pshreRAM->a);2 E% \1 f8 [. w  u$ `
                printf("b is %d\n", pshreRAM->b);% C; M8 R2 n) w8 |1 D$ J" ^' f* n" z2 G
                printf("count is %d\n", pshreRAM->packet_cout);7 i* O) x0 K: N' }, p
                count_copy = pshreRAM->packet_cout;* }# g/ o5 {" n$ K0 h
        }$ z: S; {' i3 Z. w. B( p9 g
        else& \, `; [' R4 Z, ?. E
        {
. \6 W4 M) t1 C5 j$ E/ v                printf("No effective message!\n");
  I2 _" ^7 h" D# P$ K6 h3 }, @        }
$ ], U. o: g6 U- C}
7 \9 q) R8 M4 o& S$ H, _6 ?% p, d8 r' [
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
- O) Z- E3 A. O7 O( p4 K7 G6 \  v3 ]3 ]9 ^
* x, E( Y+ {6 G7 t$ i3 X

* n: m3 `! r: Z4 I2 o1 c; j$ j
! r6 S+ ]4 I; X0 K) p" P* b' J




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