嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 # p/ Y, o- W! S" m9 a+ i+ ^
+ G) V. o) p( U8 d( `0 Y3 j0 d( ^
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
' [% L4 \# q8 f) Q8 x. W) H2 s7 X#include <unistd.h>2 C/ n3 v5 f- ?1 t
#include <sys/mman.h>
5 r% X  b- V% [  C8 P" r6 Z#include <sys/types.h>& G$ B/ h4 Z! W1 a
#include <fcntl.h>
2 n, z" n7 _/ c& S
* D8 w# t- X1 K% s#define SHAER_RAM_BASE_ADDR    (0x80000000)   6 |) {$ ?2 K- C5 w' B' \
  J/ g5 @! W* h& Z
typedef struct( q: A1 J* a# w) ?% ]: V0 M7 |
{
6 E% l: _9 f+ u% @, @, L        unsigned int a;
* }. v9 o) C: U6 O# H* v" r        unsigned int b;! \) P( P3 r, ~/ U8 I' P. v
        unsigned int packet_cout;
& \+ U, G1 K: q1 j' X9 K1 F}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: a, N7 c4 z* u  F: ~: P& r/ q' B( R# W$ {2 L/ H4 S/ S
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);+ c% `; q# k- @* l3 T6 J
unsigned int count_copy = 0;- c# e$ }5 \: {# R/ B( V
/ l  U, l% C: I2 E- h
+ U/ j! D, E" T0 @% U- B# @# V
int main()8 r3 S" }$ e/ i# o/ l- `
{* X0 {- G& U9 Y  L3 k
        pRX_MSG_PROTOCOL pshreRAM = NULL;, E+ r3 l# D7 r
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;+ b) w6 c3 G0 K% f3 W+ w! {( U

1 w" B7 L$ c! n  K' W0 o  |        while(1)
  y# ?* A% i$ Z5 X0 w        {
8 e# y2 m  h3 _% {0 p0 Q. f8 e  V+ j                read_MSG_buffer(pshreRAM);# Q, d; j; z( j# G8 p" e
        }                1 J' D0 s+ M( I& D9 c0 w
}3 |' u' {9 `( s9 w6 _8 Z" P

: i. z) ~" E' h* ^& r0 Nvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)2 y) L8 e  {" _8 \/ u8 `& m
{+ ~+ @- j1 }9 S' _+ [; S
        RX_MSG_PROTOCOL buf;$ i6 v2 Y: _4 U& N3 I7 S, Y
        7 u' ]6 e# {' n5 F) d: \$ P, l
        buf.a = pshreRAM->a;
9 P" S5 M+ G* [' A8 a* R, q        buf.b = pshreRAM->b;
: u& [$ Q- L) c$ ?# C! |8 v% z        buf.packet_cout = pshreRAM->packet_cout;
$ G5 y# `* Y/ V9 ~( q5 ~4 S/ Z' z3 d        2 }) L7 K8 U- D: x# s4 V2 i6 t5 ~
        if(buf.packet_cout != count_copy)
8 H3 T3 C0 `; H( |  A        {
5 F4 |& v( c0 A) [                printf("a is %d\n", buf.a);
6 E) g7 Y1 [2 P: w" C                printf("b is %d\n", buf.b);
/ c0 f) [. r1 t& B5 J# n) I7 o. y                printf("count is %d\n", buf.packet_cout);
2 U6 }" K, s  ~8 ]5 T9 I& A; E                count_copy = buf.packet_cout;; Y& t1 C' ^$ o0 a! Q  p
        }2 E+ v$ q2 r' ^" _% I
        else! @6 U  X  r1 r! d
        {5 d$ a6 Y7 i) m- h& a/ D. T% q& m
                printf("No effective message!");
) h/ Y/ S' K& F8 w8 L' G        }
- p2 d5 d# {3 M0 M}4 P" Y( `1 E) s
% F: Z7 L, j+ u) r

2 r' G; ]! I& c: N" @但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
( b- I& n4 H7 O  E0 U5 _使用下面代码,对内存使用了mmap函数后:1 _& g) Q/ R; W/ G
#include <stdio.h>
( x8 S) @+ o/ M7 {#include <unistd.h>
" S+ j, {! j& ?! T$ Z# \#include <sys/mman.h>
7 Y" R3 Z- _, c3 l, m#include <sys/types.h>9 ]* Y6 m: N1 K! R& F6 u$ G  i* f3 H
#include <fcntl.h>
$ i" M/ _* E$ I8 J2 Y4 h7 ?7 }/ \* M% |) D+ |: C; S
#define SHAER_RAM_BASE_ADDR    (0x80000000)3 s1 m$ a- Z8 p& _6 ^
#define SHAER_RAM_SIZE         (0x20000)   $ R5 S# g2 i+ _0 q

* g1 n& f6 W- H) Otypedef struct
4 ~( [9 B: K  Y' D" d( s{5 w' o7 R- {& Y- v2 ^; K
        unsigned int a;! q6 i' d  q2 w; ]7 F9 c
        unsigned int b;
* a! k. O0 J8 u" q- k, h4 z' {        unsigned int packet_cout;
, b/ m& x# S& O}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;/ B' t, @% R/ V" g+ }/ `0 ~
# n8 e5 C6 w" H6 o) F3 X4 f
void read_MSG_buffer(int *baseaddr);1 C$ u, l1 B2 l7 C9 m
unsigned int count_copy = 0;0 b+ z% e: G6 [' i) j+ {
% D5 D0 i- T3 K% L" U( R
int main()3 Z0 E: I. r% m/ P3 U, t
{
" N4 }( S  {  x2 a4 N        int fd;9 V4 w8 w7 ~1 `* o3 d
        int *mem = NULL;  r" W) {1 `& m* K( Z
& Q) t* Y, n' b
        if((fd = open("/dev/mem", O_RDWR)) <0)' Y' [' b# v3 f2 [, E: ?
        {5 d3 s1 V4 i8 z0 a# J  x' X
                perror("open error");
. L& o) S/ i- z& [; F0 ?                return -1;. W; X* @; V  m
        }- a8 o2 }* V, W& r/ x7 ]
        
) b5 y1 j% B5 E6 I. o, Q' X3 _        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);; I9 L- j$ U: F4 O, s# s7 N

( V) N7 r* u  T        while(1)1 G( m- Y7 S" ?: z3 C1 X% J1 |
        {, s& j' r9 M- b" k! Z
                read_MSG_buffer(mem);
8 H" {4 L" T& V) J5 S' ?' e        }                & y8 l, p6 G6 Q; y0 I0 L. Y
}7 z. T9 {' j  r7 T5 d7 {6 d" c" P

7 Z% s: N7 `- T6 V& \void read_MSG_buffer(int *baseaddr)
" b. |) ~5 k6 i3 N{
% q* n0 l- F9 l3 N5 F# Q        pRX_MSG_PROTOCOL pshreRAM = NULL;
7 k- y1 }6 U4 X7 j
; R, H+ a# h1 a2 v9 p& y        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
* M9 d3 }' V4 x$ {- H, z! P+ s+ n  L3 b
        if(pshreRAM->packet_cout != count_copy)
( Q, y( X" N7 X. e, p& \        {
- _+ D6 z0 D- F! n                printf("a is %d\n", pshreRAM->a);0 A+ k) O* L; B( p* u2 e. i
                printf("b is %d\n", pshreRAM->b);
1 k# N* V: d1 ]. y: @5 b' ]* F                printf("count is %d\n", pshreRAM->packet_cout);" T$ ]5 N9 M- H  `( y
                count_copy = pshreRAM->packet_cout;
! m) A; e; A, h        }
# Z6 K* ?1 ]7 `6 z! _        else
, x, r" V$ m! Q0 q  @. }) \$ o        {" a. O3 U2 {; o. c5 F  x% H' p
                printf("No effective message!\n");
9 E. M! C4 U# s0 r2 I+ w, r  L: M        }
( H; s+ m: @( {/ h; j# d! z+ S* v& L! b}  l( [2 l2 d3 p! O: J
4 r, h& N7 I* f
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
, u3 q7 g& D9 b/ ]& |. o4 D! Y) n/ S. D8 O3 q5 C: h0 s3 h
$ D$ t7 x# y: V3 ]

: s9 S  s% x1 @( W1 O: e2 ]- |) y9 J6 m6 Z: s6 f- @





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