嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
9 c5 s+ y* Y$ B) I* R0 u" u
: Y+ l: q' z/ |+ X4 F1 ?, l$ NOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>/ p& b7 w8 M, Q5 I5 C, z
#include <unistd.h>
% ~& N$ c4 B+ p1 ]1 C#include <sys/mman.h>( @* h* T  d: f' L7 I2 f
#include <sys/types.h>, \3 u" l  X4 R6 e: j
#include <fcntl.h>, _" {& I( ]+ S8 Z8 ]3 Z7 a+ D

1 q0 i6 C" c8 |#define SHAER_RAM_BASE_ADDR    (0x80000000)   : f: I) e( h7 {& X; x! {: D

* |7 T" |" |2 K/ J% Itypedef struct# {: O- A7 l& R% j
{, d# F: k( c6 |9 [
        unsigned int a;
% s% Y, F4 x# B& j& @        unsigned int b;
+ c' }3 B6 M+ D        unsigned int packet_cout;
$ T+ K: S+ b  n6 C3 D}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;  }1 I" d6 i. Q* @1 f) m0 j/ T

/ X/ I) C7 N  o  m+ Bvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);0 K6 j0 r3 P/ ?% F5 i. A) h
unsigned int count_copy = 0;
& i' ]+ X0 [" Y/ H8 K* T
  B; J+ F$ e3 t" L& V; M: r; I4 c/ }, X! ]- Z9 @
int main()* O$ c" t9 c+ P" K. R9 E& \7 \
{' P" @+ `1 F* C1 t/ ~0 J  T
        pRX_MSG_PROTOCOL pshreRAM = NULL;
2 u% m' |, Q" `6 _# U" z1 T        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
# Z1 `1 _# y  B5 c$ {& o3 k
0 e' U' }6 h) I, m9 ?+ s+ _        while(1)" y- ]* C5 X7 Q- b9 u
        {
) Z! `6 x) {" z+ ^# `6 `. z$ T                read_MSG_buffer(pshreRAM);  L# {; U9 x' a7 M
        }               
1 J& }# [) t% C9 {( w) u}
. e7 `0 ?2 q/ c! n, Q; s, F9 C) u9 `* v# Z! X
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)3 G6 C) Q% K7 M0 h) h* B
{
! V$ `' u$ o$ \5 c        RX_MSG_PROTOCOL buf;7 `" R7 n- e- ~" K+ K* h
        
' S8 I0 G" a2 F0 |: k# `        buf.a = pshreRAM->a;9 Y- A- v4 v5 h7 a
        buf.b = pshreRAM->b;3 J& X8 {4 S4 A" G8 ~( {* @& J
        buf.packet_cout = pshreRAM->packet_cout;
2 I# V! v  X7 ^+ ]        
! k% K  T/ C3 O+ t        if(buf.packet_cout != count_copy)0 y9 p: b" @! `5 Q, t' d
        {% F9 p- H) Q+ v
                printf("a is %d\n", buf.a);( P' j, F$ Q- j) U' f# H
                printf("b is %d\n", buf.b);! r! z4 `7 g! o6 _
                printf("count is %d\n", buf.packet_cout);
( M/ W* M. s: I4 @                count_copy = buf.packet_cout;' z: h4 I, Q7 L! e$ H1 o$ t
        }
! V  `' ?( [5 S3 T7 ^+ X, L- z' u        else
+ S1 ~6 }/ x$ w, G5 M* k        {- V! }+ x. \0 F1 i
                printf("No effective message!");8 `; |. }: K9 ~6 \8 B1 \; i
        }
# f$ o, p$ ^% {' B; r}# n+ U& W1 b! o

( D% r! o; V2 a; g  {+ D+ F
- F/ z" S3 q* G% D% V: T但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。+ {" A$ h' b  U7 G8 @& l" _
使用下面代码,对内存使用了mmap函数后:- N3 g& B4 s( u3 `8 L
#include <stdio.h>9 G8 F8 {' b: x/ _7 {$ O
#include <unistd.h>
" M# @7 U# N9 f6 V' [3 h, j$ F  q#include <sys/mman.h>( w2 J# D' n" x& ]3 S5 Q
#include <sys/types.h>/ c* J# ~" m: s4 S+ f  S
#include <fcntl.h>
/ g4 ?* w: w9 T. A2 E' q; Y% [$ O+ f* H9 L$ S7 i% C, @, \5 _4 i
#define SHAER_RAM_BASE_ADDR    (0x80000000)4 M% T- A8 o2 [- e- w, m
#define SHAER_RAM_SIZE         (0x20000)   0 n/ {: {% [* T( O

& d0 Z+ m$ k4 F3 `typedef struct3 A; a9 ]0 c, @5 k4 E
{4 \1 j- i  X( S0 h' \! ?
        unsigned int a;4 \# y% z' z* D& Q6 Z$ u5 z
        unsigned int b;; n1 Z! A6 s- x/ D
        unsigned int packet_cout;
) b$ j7 ?* B+ _% z9 [( x}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ v2 j" v& N5 [: X; a1 H/ Z) Y+ S* k# ^* q9 H1 d/ Z
void read_MSG_buffer(int *baseaddr);  ^: g. @4 Q5 d  v( v
unsigned int count_copy = 0;$ s: ^' |/ H) Q0 |& w

, o3 x  w# z. q! |! u* yint main()- ?2 t( ~+ q* x$ p9 P6 D
{
: U4 |7 Y$ |5 i        int fd;, `4 O0 C2 l8 `
        int *mem = NULL;
+ w2 L3 t1 L- c" f/ D3 z: I* y. i7 D2 u+ V
        if((fd = open("/dev/mem", O_RDWR)) <0)
' U0 O$ E8 L1 k* e. y1 |/ A        {
; f2 p/ P  J; d& U2 s& v                perror("open error");1 T& x2 |  h7 V- N( h8 M- J
                return -1;/ @  {1 t; Z- x  U* x" V
        }+ S: ~3 o# ?" h: N
        3 p/ M1 p! U8 u3 D
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
1 c0 T7 R2 n& B- ~2 W+ n6 x# J* I9 N/ V# n7 K! G  h: b0 K/ o
        while(1)( H9 P/ T( t+ v! I/ O% m6 S, P7 U
        {
8 R3 _4 K5 \. ?1 ~2 }                read_MSG_buffer(mem);
! t. g8 O+ C2 @. k! r        }                , {) p* \/ D& |) T. T! f  E
}
2 L& ^7 m  W$ |0 L( M" x/ Z. s5 |; C& u/ f0 h5 B- @
void read_MSG_buffer(int *baseaddr)" C* C/ w- w/ m8 d
{
; |7 Q: j! O$ S. q, h        pRX_MSG_PROTOCOL pshreRAM = NULL;
% j3 m% j- A% i4 T9 J8 j5 r9 F( P) E/ {5 X( f& [# g; x. L$ h, v: b
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;1 a* A0 T; V) Z' d

" ?8 h  x, V4 R* a        if(pshreRAM->packet_cout != count_copy)6 ^8 k/ g! f4 M
        {
5 r) T! v3 N6 d7 u5 c+ r9 w                printf("a is %d\n", pshreRAM->a);
- B: b4 X& y  J2 D: D8 ]* c                printf("b is %d\n", pshreRAM->b);) E- P  i* U# u: A& a
                printf("count is %d\n", pshreRAM->packet_cout);7 g. f4 R$ \$ R8 v/ ?' _4 ^
                count_copy = pshreRAM->packet_cout;
* A2 l! n9 c  U        }
3 o" k, m  b- Q& j& v: T        else! ^% ~" h, d* p) p& B0 E
        {
& {( M& E- L( Q, C                printf("No effective message!\n");# Y. B# m1 Z; q% ~/ u4 `; Y
        }
* L: j5 X7 s' \: w}
2 R$ `, x$ B5 N! m5 A* C. b/ g/ F3 E8 ]; W: C
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
7 ^( g* p4 c6 Q* ^/ ]) @9 a, \: h
3 p. W' t  S% b" l  x5 x7 Z+ S$ g4 m+ B2 E

7 z- H& e, r- f. r! F$ M# d% G1 Q6 r





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