嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 # H7 d6 C3 c5 q4 l- @; y  S
8 [$ }0 K8 V6 }. F, L
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>) q/ v1 B+ c( g% z6 w& {; U8 G
#include <unistd.h>
8 G5 o* b5 `- G/ H. Y, R#include <sys/mman.h>
7 r7 L: k( J; A. p. z( G#include <sys/types.h>0 s+ d! u7 B6 S* K
#include <fcntl.h>1 c+ O. r5 C4 m  M+ C! e
# \& h  f" N, `
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
0 S  y# X: p& H; z  K+ n0 Y
  Y- f! G; j+ g  k- ~$ J' i3 ^typedef struct6 \  Q' B  h; S* S9 ^, i7 H8 ?4 V
{
8 p) ]2 l/ z2 |        unsigned int a;
+ v  E6 T# E1 j        unsigned int b;- D3 R7 B7 h/ ?
        unsigned int packet_cout;6 {( J5 d3 K! B0 c! Y, |
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. l* a2 y# ~' Y
  h) F/ j+ G$ Q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
+ D9 J- H+ p4 d$ ~" {: |" m# b1 r  }unsigned int count_copy = 0;
7 a+ P! @, e* d# c1 p6 e$ P1 C
7 V$ d4 T* D9 L$ j1 g! p1 a% q0 S* e2 V3 M7 o7 a% Y9 t' N
int main()
- Z$ [. N( z3 [$ K4 u# N' l7 ^{
- @7 w) ]- X5 d9 Z0 _+ o        pRX_MSG_PROTOCOL pshreRAM = NULL;5 m) _# P0 s( m# a/ D
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;1 x8 z( b3 n. f! q- I" p
' g# H1 l" s/ m( H; {" q
        while(1)
4 r* S! S  U- @, b  Q        {, ]* L' A" G3 e  z& q
                read_MSG_buffer(pshreRAM);; n* h& L6 Z+ G' C( }
        }               
0 M1 v+ t1 d( ^; x" T) p, Q1 q" m}, T5 q- |* b; q) _$ f! i: P* p
% y& T& J/ ?' [, m/ [
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)! Y& n3 A! h' N' |$ T) w. d
{
0 Q( N2 U8 z# F7 l* g# b! X- k* n1 N        RX_MSG_PROTOCOL buf;
" i1 E4 B6 Q3 M' Q+ n        : N: D. t0 B$ _
        buf.a = pshreRAM->a;3 M; r& }4 g& }- w  W$ V$ \
        buf.b = pshreRAM->b;
: W7 x2 A, a$ Q5 Y5 g. |* a) B        buf.packet_cout = pshreRAM->packet_cout;6 n* a+ y- v% W/ Q; G, H
        ; {% D1 c+ X; j+ C6 u& \3 S: f6 p
        if(buf.packet_cout != count_copy)
! {: E9 _( Y- k1 e  D        {7 I+ I) O: z) b7 M8 ~1 `& `2 K0 y
                printf("a is %d\n", buf.a);" [) ~' e, z# K( X% c
                printf("b is %d\n", buf.b);
1 {0 Z3 ^& U9 ~* r) |' r0 {% J1 k                printf("count is %d\n", buf.packet_cout);
4 L+ n) z2 M9 g. D% F                count_copy = buf.packet_cout;
7 x/ L; t8 K( R+ ~8 h1 V        }
: e: t) H6 Z  {5 ^7 t        else
& C3 F7 |: k9 P: d& j        {5 s# C: Y! Y3 q+ ^) s# f
                printf("No effective message!");
. U* b# }+ X" y+ I; e9 i0 F        }) R2 R/ z5 U+ H9 E
}( s; W" M( Q. t! t6 T  Q9 z

5 x8 o: V" L3 y! O" [3 Q& B8 T4 W" p7 P9 S: t$ k
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
. v/ X  r3 ]/ ]( H' P使用下面代码,对内存使用了mmap函数后:
7 ~4 M$ [8 O" ~+ U7 L; i  {" h#include <stdio.h>
( ]! G8 J2 B! z  Q! v; g#include <unistd.h>
) _5 s; T5 r$ g#include <sys/mman.h>$ P6 t4 z* w& y  C3 }9 p5 G) G
#include <sys/types.h>
! ~. {( B- P3 w$ \* \#include <fcntl.h>
- c# E  i1 S6 s8 S: S% l$ `0 a% F6 H/ J+ t' Y+ ^
#define SHAER_RAM_BASE_ADDR    (0x80000000)
9 c% B5 `4 I9 O+ r) f# u#define SHAER_RAM_SIZE         (0x20000)   
" L, m2 L; ~1 r0 I% V/ |$ W
2 p$ i3 y1 n9 P* ntypedef struct
) x+ ]/ ^. k% F; G$ ^, M. e, u{
) z  u/ F- f% J/ V) U  \9 [! z, T        unsigned int a;5 a/ K% X5 `1 D# w/ G8 E' W
        unsigned int b;0 L7 m) X' V+ m
        unsigned int packet_cout;
$ U! Y6 Z. N* S! W- I}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;5 K, u" T" W; O! q) }. t/ k

+ o/ ?4 o& m! `/ S6 N9 {void read_MSG_buffer(int *baseaddr);$ q: y) s9 I/ l4 z$ ]' {& @4 N9 b
unsigned int count_copy = 0;9 X: f7 |: J3 s) {3 i

5 Q( K/ n+ E3 {: C6 }+ O# G. V1 @' vint main()
: T* D3 U7 ]4 }$ ?/ P3 s{/ {# X- `5 A: V
        int fd;: `4 F* X! r, @5 O. ^& \
        int *mem = NULL;# v6 _4 o: ^: U8 X- x

7 G8 k( a' r# c/ W8 T; {: W        if((fd = open("/dev/mem", O_RDWR)) <0)
4 x  ~/ d; u% n0 J* d        {* ?" u! B6 T# E9 N6 h
                perror("open error");9 {. E" R- o- H6 O# _; j3 ~5 ~' i
                return -1;
8 O# x3 G1 ?* X: D/ s- k5 n        }( u- ^6 W* s1 ~, u( m6 m9 q& B
        9 C/ g" ^% d4 ~
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);, ~$ ^* ?% T* l1 K6 _- Y  @" w
' Y( O$ T1 F1 K2 E
        while(1)
! F' d" `( v  O' _8 {% K$ U        {) x' D. ^7 Y1 w; V
                read_MSG_buffer(mem);
0 S7 H! R. s6 {& ]7 b; J        }               
, L3 ^% i& n2 q- z/ k0 p}
8 o) K5 l% o* v9 m6 V2 |( U5 u" ^7 n+ I6 Q
void read_MSG_buffer(int *baseaddr)
4 P$ B9 D6 ^+ o6 C8 _) Z' F{5 Y$ ~) w. ?+ o
        pRX_MSG_PROTOCOL pshreRAM = NULL;( ~6 N- F- A3 G9 s6 x! L

8 {8 h: }4 d1 |, s5 {( q        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;( L2 @, A* W" V+ w% t8 f
' x$ m4 l  \- V* p
        if(pshreRAM->packet_cout != count_copy)7 b6 _5 M" T3 r  z: m& _& t7 I8 j
        {# v% |+ H: ~% G: M/ m/ B
                printf("a is %d\n", pshreRAM->a);
3 P* ?8 b) \* ?6 [+ y                printf("b is %d\n", pshreRAM->b);
# v- C/ k; \3 ?  t2 k: o+ i( F1 X) ]                printf("count is %d\n", pshreRAM->packet_cout);
! ~5 J5 j" N) u( M: }, h2 ?                count_copy = pshreRAM->packet_cout;; ?- h% T. ?$ K" z
        }+ y# Q, e& c3 m5 ]
        else( p6 p3 o( D' Y) i8 ?. P
        {
" b0 i8 o2 X8 t$ D6 I                printf("No effective message!\n");
: G* j- o7 l8 c: h1 G        }! {* Z  B# E+ N" U/ z3 s
}
7 K/ P3 x9 i  u" h' g0 K
1 }& s0 I7 e! n0 K5 h- W# A. R& w没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???) }$ L  p, }! D; z

. C+ t* d1 U0 F. |0 u( y
8 m2 ^( ?/ n0 h- `5 Q1 ~- J5 [+ m4 A0 i4 j3 u. q8 ^  \
4 F$ b4 I! X/ h/ c  |+ a





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