嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
. U$ V# C! L# f) t0 M: k1 T( f+ z1 b9 }# x) x
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
, z' a: R1 Q2 V! e9 N7 S#include <unistd.h>8 O0 L- [  P# q* d+ G, z2 a+ |
#include <sys/mman.h>" B/ S/ e& v' d
#include <sys/types.h>  ~2 j: S, {; x3 m+ s
#include <fcntl.h>) Q: N1 @; Q2 [: ~* l
8 q' T% _  a: {; b" j; p
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
7 a. D; F- b  ^+ J% o7 v0 p
2 n( h3 V& d+ v, t4 `8 {; T  ntypedef struct( J" B9 t7 q5 [7 S
{
; h2 |+ d) A; r        unsigned int a;: B, I  Z2 a$ g5 p, v2 x( S  n
        unsigned int b;
4 E+ L( h+ ]8 o( S        unsigned int packet_cout;
1 ]7 E' Z* {, w8 ?5 L5 j}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' q4 \% K- X$ I7 y) U* f+ x' g+ t9 g# s7 ^- p# \! C
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);% F2 z! }6 F( V# p, ~
unsigned int count_copy = 0;7 _+ \3 M9 l1 u& d, o' X' |; \( D$ h

+ v+ \7 W7 s+ L6 B
! M& K- i2 e3 Iint main()
' [) R9 B7 t  y2 e: _( n6 U{
6 A" G3 i9 K  u, j  {        pRX_MSG_PROTOCOL pshreRAM = NULL;
( }* E5 [5 ]4 l( k- K" L6 e        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
8 c" \0 H! `$ p" `( H6 R- Z/ V+ C. B1 a8 N/ K. j; ~- d+ R- A# X  {
        while(1)
2 l4 U: O: y) y( j, S3 s        {
" V& K( G/ d- e                read_MSG_buffer(pshreRAM);$ m3 M6 N7 X! d8 _6 K5 T$ q/ [
        }               
8 _5 I6 y1 H) M4 V* H7 u2 Q}8 a* }7 ?  J. O1 p0 l' Z! Z4 _% b# z
* }3 ]" }5 m) ^& R0 B( \# z" |* A+ a
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM), S5 T! }, j; W7 z4 `
{1 m& `: n7 f7 X- s% k, Y
        RX_MSG_PROTOCOL buf;! x4 z1 v  _& E3 l  U; P
        
6 w3 M. A3 n3 a9 z+ M        buf.a = pshreRAM->a;! q) `4 h* s% Y/ |9 r7 V1 r4 \3 R
        buf.b = pshreRAM->b;
: ]$ k4 K3 [2 D8 p0 W  ^        buf.packet_cout = pshreRAM->packet_cout;
. \' u9 i8 q4 F: K        2 o- a# m/ k* }4 @
        if(buf.packet_cout != count_copy)
- R  k, {% O8 u0 W4 s: V* n        {
. o$ n& h! N) r2 N/ A                printf("a is %d\n", buf.a);' b7 Z7 B) M3 E
                printf("b is %d\n", buf.b);
  W6 C( X5 X$ [                printf("count is %d\n", buf.packet_cout);
* w; _  c' Q9 N0 c$ H0 U  K                count_copy = buf.packet_cout;* x0 H1 L: |- U# x: A
        }
9 ^  N9 }5 D! c) d        else
8 r3 J4 K1 D  s/ ]8 O& H        {
% M8 Q; H/ A9 S; U5 r& b                printf("No effective message!");
0 ^9 v* G5 i6 L        }
* N+ Y! I9 Q) h( M8 {' _/ H}2 r: D0 z* T# Y" m
! ^* Y/ o1 X5 d) s! Q9 G: N4 }
# m; T; @. m$ u( l
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。6 T5 W4 p% o3 L0 g) y
使用下面代码,对内存使用了mmap函数后:, {1 Z- z+ C: Z
#include <stdio.h>. e. l. y. q& h- U% {
#include <unistd.h>
& D; ^' v9 C3 g#include <sys/mman.h>; }2 X! p/ ?0 s  n
#include <sys/types.h>
+ d+ D, U/ W' Z#include <fcntl.h>
8 E$ b5 q* l& j' v. x8 C  \
; T7 a; S) @) O6 d/ X% u( G! v7 M#define SHAER_RAM_BASE_ADDR    (0x80000000)
. ?! ?6 C& }5 j% R. z. h* u#define SHAER_RAM_SIZE         (0x20000)   
8 y/ ?2 m0 Q& s" I' M( \8 d3 E) Q5 a. b2 x6 y- b
typedef struct
+ S! k- C0 l6 |/ K{
9 m5 x0 G9 d/ Q$ ]* u5 ?" R- H        unsigned int a;
8 z! v" U  L5 H# K        unsigned int b;, B% g5 |8 P( v. a" O
        unsigned int packet_cout;
1 j. c, E& u$ K( [; w  [}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
* T, w& D1 v" \% U* W& i4 E7 d+ ]+ _* x. N/ k+ r( z0 z4 |; U
void read_MSG_buffer(int *baseaddr);8 f0 T( Q$ Z7 N! Y3 P* a& L& u
unsigned int count_copy = 0;
& p" [: f' D3 q/ F; f5 j* k0 t/ ]" Y' t& v) q3 w' V
int main()
- D. I7 ^: M6 n{5 i* m# E  z' J$ y
        int fd;
1 u% |) Q0 ~! p, Q$ X% H) g( V# v        int *mem = NULL;
( l3 [4 S( s/ T! E& w2 M' f9 O' ^
3 T: k: {, |5 g' N8 Z        if((fd = open("/dev/mem", O_RDWR)) <0)- g' C2 A9 M6 H4 q8 T' S! y# @1 f
        {$ T- x( M6 t$ S* {
                perror("open error");4 Y* j' `# y% F1 i
                return -1;! D( \- }1 d! ]% @
        }; L) f3 Q  s2 l5 U6 D
        7 F0 t+ ^8 T1 `  V* Z
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);" H4 j* Q8 b5 N9 T% e" A

* Q( L6 ~  l# i! z        while(1)
3 Z6 ~5 X  ~0 t" i        {
) N1 B, o7 s# {- V                read_MSG_buffer(mem);
7 a& e. }1 J+ I2 {1 b5 w        }                3 T: b2 }- t4 w; }) B: h
}
  }) y9 L  p7 W0 [6 H& @- Z
5 h+ u- e, X! v# I; xvoid read_MSG_buffer(int *baseaddr)
1 A! @0 w0 c  o- A2 |! V+ k{: R7 @7 {8 Y: u4 b: c
        pRX_MSG_PROTOCOL pshreRAM = NULL;; m7 F4 c; J2 m, ]

! B; R$ i/ @7 z+ J' {3 ]        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
2 w+ f6 L, u1 c) S: M" t  g: F+ [2 p# c6 @6 K) Q9 D
        if(pshreRAM->packet_cout != count_copy)
. K: X& I7 y' x- b8 }  R* @        {/ [- Z, Z( q4 h  P
                printf("a is %d\n", pshreRAM->a);+ \4 @( w, [, \+ g+ V* A0 J( F
                printf("b is %d\n", pshreRAM->b);: T: ^/ {3 w2 D- f0 O+ k
                printf("count is %d\n", pshreRAM->packet_cout);
; W. Z( v7 h; {# y/ c                count_copy = pshreRAM->packet_cout;
7 |& ]* _1 l" ^- K& m! Y( M        }" c( o% F; _( P1 D
        else
( Q( W8 v- X' M' b0 Y" V        {
1 J" [+ w: f- y/ [* x                printf("No effective message!\n");; ~# R. g6 p# a% k% l7 [) u
        }6 ?4 m, k6 F! U3 I. S7 A% n! L+ w# F
}
- F* U: }/ _8 l0 Q2 H
; w* x' I* t0 ]) v: O0 Y- ^7 z7 L/ c没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
1 ?. [# ~  [4 ?4 G' ^+ N/ f7 Y: O4 Q$ T! v  g$ ]& W0 f) @8 M

# @+ E- X, S( ]( \8 U( O3 s: s; z
: E, e- y+ P* u' ^1 P





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