嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
! V$ S9 S) D$ N% N  h% [( ~
* k6 o5 Y* P. n+ ^$ _* GOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>2 l$ u3 u# z" Y/ ]
#include <unistd.h>' j; [& H4 s5 f" m1 a1 ?
#include <sys/mman.h>
- s+ L5 u8 v; {6 t3 s5 M#include <sys/types.h>' S5 W. O2 l! }/ K: ]0 J/ `3 G# t' A
#include <fcntl.h>
9 \9 ~8 v: g# [3 a3 H
' a: P3 U( ^, U, `6 E* |#define SHAER_RAM_BASE_ADDR    (0x80000000)   3 F; V/ v: b$ l/ ]+ J
0 P) u; N' u( i: ]' S/ y/ Q- q# `1 c5 g
typedef struct
- c# s3 a% w& U; l5 d& s& `{: J7 O' o  w& t: w% V
        unsigned int a;
( d) {" j8 \& d& b5 C% a1 S. s        unsigned int b;
7 |9 w+ r9 f2 i3 q  _        unsigned int packet_cout;2 g+ T' Z; [7 W% x: j" j  N" i& D
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;9 u$ {* D9 i1 b6 z3 Q5 o( b$ w

2 {. n$ W7 N- C" ?) hvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);0 h+ }, l. S' }# o" G
unsigned int count_copy = 0;2 ^; E- [5 E) L  M$ ~5 r
7 M; B/ O! p5 A( w! M8 }  z; G
4 n' T$ t4 `$ p* `! ^0 W6 a
int main()% B5 s$ W2 F1 P. Q  l! q* l
{( l7 x; [( ~: o
        pRX_MSG_PROTOCOL pshreRAM = NULL;
6 ]0 n$ p7 |( l6 f$ F: ]7 E        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
) r( |2 z" U; B9 A7 L; j! ~0 }
7 x: w8 }: M, d        while(1)
. Y& s* r+ I/ o        {
2 @6 ?( {4 Z( z3 q# O0 [                read_MSG_buffer(pshreRAM);  M* x1 z  s8 f/ y$ }
        }               
9 i* v( d+ v- J2 F* q( K}4 d: {. M) _* N* _) m1 b
2 r, G' q+ q3 G- x) X4 y+ g9 h
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
2 ?5 E: f7 x7 X7 {/ L: v{
4 x2 t5 O$ k) L0 L        RX_MSG_PROTOCOL buf;
7 L* U- u( x% H2 Z- z6 _: @1 I        
% i! O! G* @  }6 m3 U) ]8 E        buf.a = pshreRAM->a;* s% s9 H$ w0 Q. }/ e1 o1 D
        buf.b = pshreRAM->b;( U9 N" b% S( T+ ~1 n. }: S
        buf.packet_cout = pshreRAM->packet_cout;) U& _" b) O3 t9 g5 g- |7 ?
        3 l  ~" b, Q* V! O  m# j% r
        if(buf.packet_cout != count_copy)
5 v  `/ X% n& R- Z6 R        {4 E) ~3 }5 C: J- u) R  }
                printf("a is %d\n", buf.a);
) L. s: D! R- N6 \! t                printf("b is %d\n", buf.b);
- W/ r) u0 ?5 ?6 I0 e+ f8 `                printf("count is %d\n", buf.packet_cout);
. h! S% m  O( ?1 h  Q3 p% D                count_copy = buf.packet_cout;
, v. k! }$ Q: d: J! I2 m        }: c( G9 j8 i+ H0 Y
        else# ?/ A% d4 S6 ]6 e
        {, }; Q+ b6 Y. s* W
                printf("No effective message!");' |  _! {9 I/ r  z' Y# ?
        }2 z2 l/ d2 d* x% W* W
}' ~4 W4 O( m  _4 J
  _! {, c% p2 Y+ l; j) B
. I% r, @1 C1 ^
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
* P& t8 i! M7 A  v# D使用下面代码,对内存使用了mmap函数后:
6 }; g! E8 a* x0 Y7 {8 p* J# c#include <stdio.h>$ P+ d2 Q- d* x" }
#include <unistd.h>
* J( f1 v% {3 n0 r" P#include <sys/mman.h>' P, B# f3 i7 [
#include <sys/types.h>
4 L: [+ m' u8 v#include <fcntl.h>6 K7 P1 w6 K) s" R6 i) Q% f

3 d' {) h8 ]# R4 m#define SHAER_RAM_BASE_ADDR    (0x80000000)) B, K3 M0 Q' w) }# [
#define SHAER_RAM_SIZE         (0x20000)   
+ |) d& K( L9 j" s; R1 O" Q
0 i8 ~5 x. n' T7 Q" c0 |- {typedef struct# U8 R' K- Z9 i- \$ J+ o! e2 x
{; z: ]+ p' m' U% s6 U- y
        unsigned int a;% c5 t/ ]' J' J, d! w/ ^8 P$ Z
        unsigned int b;
+ s6 S( g: F( m2 P+ n# d) O/ _$ _2 Z  F        unsigned int packet_cout;; a0 k  k$ l2 {
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;7 i9 A4 p, |. ]8 E" J" ?$ U
7 y: r" q* d4 d7 Y5 j
void read_MSG_buffer(int *baseaddr);+ p5 y& G1 j$ {4 y( O
unsigned int count_copy = 0;8 ]1 N  T0 y' X, f

+ T! ]& L7 w4 [" E9 A5 p) L+ s' u* Fint main()
2 p! S- i7 g3 J2 S  G{
2 B2 x5 T5 G  |5 t! }. x        int fd;
0 E4 m5 N5 s: X# K1 @. M- R        int *mem = NULL;& v6 A: g( ~/ D
: F' R) s4 w6 W9 B2 K, \
        if((fd = open("/dev/mem", O_RDWR)) <0)$ f! A, a+ U8 C" ]. W
        {$ Q% m. U  }) s( F' ?5 Y0 O8 H
                perror("open error");
6 ^/ r7 V7 v7 b+ c  Z5 Z" t                return -1;7 K0 ^2 U+ m+ p3 O# c& X
        }
  ?' o9 @$ a- ]1 i  o        8 s3 l, W8 E- A9 G5 L$ H) {
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);2 h6 z, E( \1 C& m! N

; _2 w  @, A1 a: N1 m% n  v        while(1)$ s( Q8 s. B' t
        {8 M5 _+ c& C9 ]  `
                read_MSG_buffer(mem);
; j; F& W9 `  Y5 F        }                9 j' d8 w7 |9 J' ^9 \
}
4 G, ^2 I- b3 E) D, z& E3 p; z& p5 A3 i" D( F" R8 r
void read_MSG_buffer(int *baseaddr)2 a* R, A2 \. X
{
1 L& M( l; U* C7 H3 ]        pRX_MSG_PROTOCOL pshreRAM = NULL;* C4 K5 S/ J/ T9 z% y

7 S$ b7 `2 }! t3 p9 l: p        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;% [$ @% Y5 w- W' ~4 `9 ]& \7 H: w9 t

! p, B' l# d/ U4 Z        if(pshreRAM->packet_cout != count_copy); y. V4 e( H: F
        {
3 E8 i% H, p9 Q% ^5 K4 n2 Q; m                printf("a is %d\n", pshreRAM->a);& k3 N; `. k  m
                printf("b is %d\n", pshreRAM->b);
. t) G8 n. i" T7 R: U& ~7 E( g9 {                printf("count is %d\n", pshreRAM->packet_cout);9 t# n# ]2 D9 L4 x6 b
                count_copy = pshreRAM->packet_cout;
+ {0 B5 d9 I5 L        }
, @7 Y' T  B3 r: b3 n7 P        else8 h0 w7 r& q* _$ \8 F6 r
        {
+ N  D+ \( }# Y                printf("No effective message!\n");% f9 p% [7 ~5 b, r- _/ o2 n
        }
# a9 ?3 K5 x0 H$ x}' |6 i1 ^  _" {/ U, z% k& t
/ i' n7 t" y% t! n# g
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
% ?9 {% {' M# h) H" n2 l! G2 [4 Y7 }) I$ s" d2 ^9 Y0 x
' ]$ [8 Q( l! ]: S

' L% ^2 E. T, l7 N  @" O
) u; r, j2 f, D2 e$ U$ J; M




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