嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ' p. k2 @% e/ Y4 c
, @2 {& x! v( z6 x$ ~' {
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
0 h- ]/ {* P. L0 [  K#include <unistd.h>
! b0 u; [7 B- K; J0 {8 m#include <sys/mman.h>/ v$ S) F7 G* u$ n
#include <sys/types.h>9 T' @+ [4 X. N$ z3 ^# H
#include <fcntl.h>/ T6 x8 `2 G! w! n9 d
' G+ D  x/ Z7 W- a4 Q
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
3 E1 V! B# ]& q1 C
( h2 |. H6 p# Btypedef struct  t( [  B' N! A; U
{
6 ?- W, e) p0 Y- H+ E- I9 v, G        unsigned int a;
4 I* n) V7 T1 a* R3 }  f" ~  E6 z        unsigned int b;
( K& i/ }4 a5 t# d7 T; |        unsigned int packet_cout;0 t( V1 F0 }% d# b; t
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;! U: H0 x" k$ \% _4 I: H
& m, _) ]+ s; P  J$ G! o
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
% i+ A4 W! f, c2 M" o7 E$ ]unsigned int count_copy = 0;: u5 R1 n3 f' d) y: Q! s

; V3 l; n# `' M( ^6 {' E, E
! z) t5 S" ^: Z; e- N0 \% Aint main()
+ H* d9 S- X; q( a$ I/ P{6 c8 K& q( x. o5 `
        pRX_MSG_PROTOCOL pshreRAM = NULL;
: b/ D/ ~( g8 n$ S+ |+ |0 I        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;) Q5 N; K0 L* H
. W: u; ^0 Q$ Z4 n
        while(1)
) u* Q1 b7 g" I- @        {
$ W! Y4 C2 x1 e9 _( N# y                read_MSG_buffer(pshreRAM);
- c7 V- A% d0 X" Y  ~        }               
& b, U  q1 V8 ]3 B- E5 T}
8 j# R$ o6 e. k; ?" M
0 T3 L9 d5 z5 A" V& x/ lvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)0 j" |6 o; R4 o) S& y
{
/ L0 ?5 G! V* \  m. N; @        RX_MSG_PROTOCOL buf;
% z% [- F& _: b8 }        
6 C5 q( r; v- ~8 e8 q        buf.a = pshreRAM->a;. A+ {# o4 O* w9 \3 U
        buf.b = pshreRAM->b;
+ }* F# P7 m: q- c+ {5 u% N        buf.packet_cout = pshreRAM->packet_cout;
, m5 U. l* K1 h- G" G        0 s. M, h7 C$ b0 x
        if(buf.packet_cout != count_copy)% U* k- [# R' I/ b! o: w7 G
        {, \$ Y$ T( s0 ~; \5 g
                printf("a is %d\n", buf.a);
7 D# t/ i5 }, y' f; ?                printf("b is %d\n", buf.b);# b$ X# j* V% Z$ E) r; v" q2 }: v
                printf("count is %d\n", buf.packet_cout);
4 t6 G3 _" r3 A4 Z- `$ }2 I5 d                count_copy = buf.packet_cout;
! S5 @- ^4 p+ m5 {        }) w4 P0 D& z( Z0 M
        else6 a8 C7 b2 O' m  z! e* G  g
        {2 }9 h! e- {' K4 H4 {; }
                printf("No effective message!");$ i; f" U: j* x: I- \1 \9 }. R
        }1 G  T! C' ~& Z5 L, w8 k+ q
}
9 L! ^' L' z" z* q$ u/ v) @
* V' A0 J- A, A; M) N) d" y: Q1 q. u. m' ^( M- H
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
. l' z& D) `2 j# T: \0 y使用下面代码,对内存使用了mmap函数后:
% b2 K3 {% A, s#include <stdio.h>3 ]. |" E( X$ u4 {% B
#include <unistd.h>: t" r6 X$ k. [" m4 b& T' _! ~+ G& A
#include <sys/mman.h>
; @- @5 N, w0 }2 L" q5 B#include <sys/types.h>
8 o, O" Q  M0 X1 F7 ~#include <fcntl.h>3 Q1 [6 v* P8 }4 ^) Y3 y) w
" D/ f0 ?5 E0 I: R) a  |% ?9 p
#define SHAER_RAM_BASE_ADDR    (0x80000000)
/ q* h7 \, H' u9 q& X#define SHAER_RAM_SIZE         (0x20000)   4 `( h; S6 h- x) }$ I+ z9 K

4 b; [4 m( y# H' `% {: Jtypedef struct) ]0 V8 I' x/ E/ ]: \$ Q" S6 g
{
2 _: S; V* p  @, ]        unsigned int a;/ J; B6 x2 ?/ O& v, E
        unsigned int b;
$ s6 e( X$ M* O& Z7 s% M        unsigned int packet_cout;
7 d, C9 b; S) ?  L! a}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
+ Q' m( m+ I" J3 }4 {9 T* E$ N) K8 R: N* c- x7 }: C3 b% r
void read_MSG_buffer(int *baseaddr);$ p0 ]# `. f- @1 R0 d, q
unsigned int count_copy = 0;& r% P8 h6 e4 M1 d- ]0 \
; @5 G$ _% ~/ k/ P; u! d2 c
int main(). T8 K+ G, k9 N# X! t
{
5 u1 v1 Q! M) _( ~8 J! w        int fd;" T3 X$ y5 K/ B6 J
        int *mem = NULL;
& t: j0 r; a* [) |6 K7 J9 H% D8 f& }; R  v6 V
        if((fd = open("/dev/mem", O_RDWR)) <0)
! V* X  ~- Q: y, ]9 e        {0 U2 ]8 I7 w' b
                perror("open error");- C, d, t: Q" W# Q5 W7 b: x: h
                return -1;: O! T) `/ B/ X5 q5 k4 N7 k
        }
! U9 m: p8 x! F) k1 u. x! O5 X  f        
; y3 \2 m4 @3 `" Z& g        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);, e% F/ |: D  n! J# C) V

7 U9 J' G- c+ X$ h% ^+ s8 a        while(1). H% k) b  O) ]9 o' b
        {
. U/ a0 v% F! l) g                read_MSG_buffer(mem);3 Q3 S8 `9 [/ u- V. o  S
        }               
7 R7 g2 P2 }3 x5 ]+ m}
7 w% [6 y& h) J6 L4 L% u
$ V7 h: E7 Z/ {8 _; f7 tvoid read_MSG_buffer(int *baseaddr)* E% V; n$ F4 z  M
{
7 I1 v/ T0 n* `        pRX_MSG_PROTOCOL pshreRAM = NULL;
4 B$ w6 Z) f! S; S" e% m- d* s
% _1 d) m/ I% t, D        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;$ [: n: e# o, B3 u3 t0 J
, @, l% f9 I5 j' L; O+ D
        if(pshreRAM->packet_cout != count_copy)+ q# E* ~+ i+ x% _, o, H
        {
- }8 J9 \  a1 ?9 Q                printf("a is %d\n", pshreRAM->a);
( ~: E) q+ ]% k4 T  C- x# y                printf("b is %d\n", pshreRAM->b);, [' [4 Q) D* [! y
                printf("count is %d\n", pshreRAM->packet_cout);
2 e, p. R' d: I( R7 r                count_copy = pshreRAM->packet_cout;
2 u( m: |+ _+ u% _8 Y        }+ b: m9 `, E* {1 N
        else# b6 z: |8 @' S% Z* \5 B; c
        {* J' _7 y* x% u( z
                printf("No effective message!\n");
0 n8 Y! @* V6 m8 ~: B# P: j        }+ R/ ]3 t! s: R, Q
}
8 g" M6 N/ S$ n1 T2 X# n" F7 z) s
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???3 u/ y6 b7 X$ s$ D4 c
: _5 r$ a. a% `6 k5 L
# ~; b3 v2 t4 N% l& x
$ S* Z# \0 f+ I' ~& ~+ o3 ]
2 X( ^, f+ U) e1 N





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