OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5980|回复: 0
打印 上一主题 下一主题

OMAPL138的内存映射是否在Linux下已经完成???

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
2 i/ P  c' _: q4 P( w' v- Y) D" r  O% `# s9 I
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
0 z/ E7 ?! p' h9 z#include <unistd.h>
7 {* |3 w8 y1 b1 }3 E+ B#include <sys/mman.h>' U3 Y  r8 s7 B  O" W: ~
#include <sys/types.h>, x6 G$ w2 y! _& V/ K% N& ^/ }: ?
#include <fcntl.h>
' E6 B0 p' {# s5 g
* T* y, L4 _+ q$ T5 F3 W4 e: U" E! z#define SHAER_RAM_BASE_ADDR    (0x80000000)   
' y3 n& o6 h( Y+ R$ f7 [. V* U" Q, J  m3 w
typedef struct3 U( V9 ~* Y7 _; \
{) j+ Q- U2 {( I7 s) J$ z2 A
        unsigned int a;
' d' X: c/ ^$ k1 U: B        unsigned int b;! Z: t% v* ^0 z
        unsigned int packet_cout;
- b8 }+ \% V- _  _3 ^. k}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 V% w: n8 `' a& l. _5 s) C
" v  w- |4 C& |* L% J" m" j( B6 a" Z1 j+ Avoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);' O8 e. d8 S1 E: h4 M% e
unsigned int count_copy = 0;
! T. z. M4 X1 P( N7 W- Q0 S9 b: ~! K3 t* v6 ~- E# W
% m$ f- B2 H. j; p: j
int main()
/ I; d7 D( E: W5 }& l, j# V{) o/ A4 q) G) _. ^3 L! D
        pRX_MSG_PROTOCOL pshreRAM = NULL;
# Y6 J. s4 ^8 k8 U8 a" B        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
# g  D# d# x5 ]4 J6 o8 P; s' ?1 v1 u% Z, C& k5 ]
        while(1): O6 \7 r, X+ E/ f
        {. N8 j  b; b1 I: m9 Y" L% ]! u
                read_MSG_buffer(pshreRAM);7 P# i6 x1 i0 I* U
        }               
2 r+ ^4 O& }2 J% _) c}
; V# Q) `3 X. _* {1 ?3 s4 B- X7 u* T1 _3 j! v
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
7 v# v3 [% d" P) p) V5 ?' B& R{& }  O% t3 f5 y& {1 _
        RX_MSG_PROTOCOL buf;  M( I. X3 z( w6 ]
          z% \0 l( e- a" P
        buf.a = pshreRAM->a;
, v( Q3 Q! w4 P0 x; }) |; d& `9 C/ i. ^        buf.b = pshreRAM->b;
5 E% f' d2 x( J8 [( V; |        buf.packet_cout = pshreRAM->packet_cout;& \4 S; J4 u6 I' P. A
        + S! v1 Z% @0 ]* e7 X  G& j
        if(buf.packet_cout != count_copy)
0 X  N8 q8 U7 d3 ?& [        {: q# f- \2 w2 J# k
                printf("a is %d\n", buf.a);- x+ ?) W' z( b5 V& \: q7 N
                printf("b is %d\n", buf.b);
; W6 t# c6 S. D; I  t                printf("count is %d\n", buf.packet_cout);
8 k, q; u2 F+ x4 n                count_copy = buf.packet_cout;. z4 D5 K& A5 K/ j% g
        }6 E& `) q. D, d+ u+ L' [
        else: e+ h1 {4 w" Y1 C5 N
        {" |# G! S* k: N
                printf("No effective message!");
5 T, u9 R: L: V/ p! x4 _        }* o: Y+ C2 k1 |' G% f
}6 N+ o+ w( Z0 G: u
1 y/ ]* q6 f. y

+ X8 p, e' n5 t7 l0 T% L但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。4 t( p" `3 e3 [0 Z
使用下面代码,对内存使用了mmap函数后:' O! c5 [# z. M7 ^( n3 {% [  x
#include <stdio.h>1 P! V) M4 U, }9 \
#include <unistd.h>
) ?5 L; b& k3 g# |+ Q* F5 r#include <sys/mman.h>
0 y# a. v! W( b/ x: ]0 E#include <sys/types.h>0 j- l- O$ a7 X/ [' Y7 Y+ V, ~3 r" T/ E
#include <fcntl.h>
; @: T! h* c$ d* b7 W. }
2 n- @- @- k, Q: u6 w) s, A#define SHAER_RAM_BASE_ADDR    (0x80000000)
7 }7 g% l7 y. C; H! C& H#define SHAER_RAM_SIZE         (0x20000)   ( L( S0 q/ A- t' Z6 E% t; z6 s2 y

# _4 g  E" w) @& ?% Z6 c+ Mtypedef struct
0 k4 J( h  t2 E" R{
" G, I: E0 Q  Q' W& O) d, S0 O        unsigned int a;
+ {& C9 r8 m% t' f# L' q        unsigned int b;) D4 @. k7 k0 O
        unsigned int packet_cout;
, Z6 f3 w1 `- j- I! m}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 r% _. f9 c4 q* Q/ ?; w4 x
1 r8 [# p+ w) P, s- Yvoid read_MSG_buffer(int *baseaddr);6 X: x, F9 r; b1 z5 N
unsigned int count_copy = 0;
$ g$ n: d# A/ p5 s2 }) e
0 f- h9 w; P' l9 u) Y6 Rint main()
. ]* H& o4 K+ E8 s: Q5 `% ]( W: k{
, x# _, |+ x! a; ^        int fd;
6 c; Y8 b6 T' M+ l# r        int *mem = NULL;: s6 c* ]* y$ W
+ B1 u  A# k2 Y5 @
        if((fd = open("/dev/mem", O_RDWR)) <0)6 s4 m- O5 y# B  g( m& \0 I% m6 B
        {
2 I1 B+ o4 B! C: V1 O& e                perror("open error");
& Y, p; B! P) k) _# @! s. @9 Q                return -1;
8 }1 L  }& o% U/ H0 j, S: N        }
: P+ V) f* Y% m8 v+ O        3 @5 A# H- T: c7 ~- i  ?# X
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);8 X# ^# S: R# v7 o# Z* Y
" f( p/ K) ]  t9 m, c2 N% a- l' X
        while(1)
! h: D7 X+ }. q- }        {' ]- E9 ^! d* b; ^; ]
                read_MSG_buffer(mem);; I5 J9 h, Q9 c/ a: f
        }               
* p" X1 ^. a0 z9 L8 O}
% ]- k$ }% S8 `( M. ]3 N" W& T. G2 C# Y; r
void read_MSG_buffer(int *baseaddr)
3 f! u/ p! ?1 f# B# o% u{5 E- q  b+ K0 p9 n8 d7 g$ q
        pRX_MSG_PROTOCOL pshreRAM = NULL;
# V' X- o! f7 [; h; k2 {8 b4 Z
$ P* R& Z; E& Q, i1 f        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;# L# X  O- m" a" A4 q6 G( T5 t
- x+ B  ]2 O9 Q' K+ T5 C9 c) n- z: W8 c
        if(pshreRAM->packet_cout != count_copy)( l# i* p8 y7 |- x( R* v8 H  \8 R
        {/ G3 Y$ m$ K' P+ o. g* X
                printf("a is %d\n", pshreRAM->a);8 R( f* r1 [4 A6 [- w3 G
                printf("b is %d\n", pshreRAM->b);- [8 N; X' C' \' y% x- l! L5 J4 k* I. G
                printf("count is %d\n", pshreRAM->packet_cout);& e. n8 Y, a' T0 \9 o8 ^  p
                count_copy = pshreRAM->packet_cout;; Q& [  Z" v* |5 {2 v
        }
# C" B: `4 U9 b" B# g+ b        else
& T( j) [& T9 v) y/ P' b9 p' K        {  k6 b9 P, o- m6 {" ]  A9 u1 m
                printf("No effective message!\n");
8 m4 x. g  h1 A2 t* A1 A4 ^        }
5 Q7 w* G9 Q  v}2 C5 q5 S; v! i1 v; m1 R
$ I; p/ K; d3 u! \; ~4 z
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???, |9 S2 L7 J0 `0 I2 @* A. H' t& B

+ y% C' P3 y* O8 N$ P5 B( ^/ M
. K' d0 x/ i+ \- b7 \
) X  e0 B. C% s5 u. T7 ?( R. U& Z9 s7 k
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

点击跳转“创龙科技服务通”

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2026-3-24 16:39 , Processed in 0.053014 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表