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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
* A; q/ z4 b2 L" E: @# k. W$ `; F6 F' K; E- R9 C. e+ ]( `% B! x2 ^/ @
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
( ]/ S- S7 \; \! b  o+ N1 J, m#include <unistd.h>3 e' B" r- D5 e5 b
#include <sys/mman.h>" C0 C, D* K% r
#include <sys/types.h>
- v) V% |; a' U! ^, o3 y#include <fcntl.h>
/ k1 e( M  q1 l) T7 I& H  i! T4 K. [; z! ^7 T" a0 C- c
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
: \- C3 k; l- ?/ j( N/ o$ {$ I
& k) o* K0 Q8 W: V. P; m6 Dtypedef struct
6 W  B* ^& f0 i4 R, K! E  h5 z' U{
( C) \, N/ A- U        unsigned int a;
2 ]' d+ [/ C: G- W7 w' P, [0 W        unsigned int b;
) y' o" a* ]/ P3 [/ s* w        unsigned int packet_cout;7 Q* e% L% V* m4 Q9 e
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;6 ]/ A1 i6 B0 c0 ^3 j7 J* H

8 n2 a1 K. v' m9 N4 N- c. Ivoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
. U* ^  V: q% I( @unsigned int count_copy = 0;
3 A, K5 w, d4 X1 a7 `  O( k9 p2 Q9 M

9 s$ o, Y. y6 j1 `+ I6 e  D- jint main()
; ]+ M1 X% j3 s{' |! g8 C$ i5 A: N* W1 @# `
        pRX_MSG_PROTOCOL pshreRAM = NULL;- o+ ]5 F4 r2 o8 o. w
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
* V, b8 A4 x, c0 ?* U5 P
8 y. [2 l7 H- u, B/ _        while(1)
* k: U% {; p( @# v        {
! x: M6 g$ Z& h4 u3 @) h, j% t# }                read_MSG_buffer(pshreRAM);
: Z8 Q# d+ V  m# j. y; @        }               
3 S8 I* c- Q' V5 K0 `}* R- Y) ~# V, R( D; e, |$ v8 G6 V
( Z' O4 f# j8 V8 R7 Z7 e
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM): q" I4 u! C+ t
{
) l. m& |9 z' \& N, Z; _" V. k        RX_MSG_PROTOCOL buf;3 v. u" X7 X" Q  ^% C. c" N( a
        9 H3 G; I. i, _% ^! ^/ ~/ N
        buf.a = pshreRAM->a;
7 y# }" t9 B' J# S, g8 l        buf.b = pshreRAM->b;
9 v, e# O  D8 G8 G9 P3 m        buf.packet_cout = pshreRAM->packet_cout;
3 m$ l( Y. l% s" x  ?1 I2 ]        ) ?1 S% D& v4 J* }8 a6 A; O
        if(buf.packet_cout != count_copy)3 x1 K' J& A0 o( l# A8 }( S; {
        {1 k: Z8 K2 P0 T+ {% e4 _* ?  {9 x  ~
                printf("a is %d\n", buf.a);
- I  y( }3 L( P* ^                printf("b is %d\n", buf.b);
, b) f) l2 U/ v* A                printf("count is %d\n", buf.packet_cout);
3 F& |) |. _7 o                count_copy = buf.packet_cout;
+ ~" }# Y0 R; W/ `, I; }. h        }
0 }: s2 [8 p  Y: @6 m6 j& M        else
. X6 D% ?( l) s/ Z8 h        {" r5 o/ k0 T8 F7 z
                printf("No effective message!");
' A, `4 I1 y# H        }
1 s3 N+ c3 |* ^' N2 c; w3 S" f" n}8 g# j* r# M: X' I' H1 u' P
# M! ?* e1 r; I2 F) ?3 {

8 \% D0 O) I; @) E9 P. E: w( Z* s但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。( |) H3 d7 v$ P: h; S. Q( v0 L9 X
使用下面代码,对内存使用了mmap函数后:; U$ |4 |+ a% ^$ }8 Z: Y7 I( L3 @
#include <stdio.h>$ }+ h( E0 w+ m1 t4 q; \
#include <unistd.h>
: z! _% \4 z! V. h#include <sys/mman.h>4 g" L/ E  P; }$ R& J& ^+ e
#include <sys/types.h>
& a, y% c8 n" n#include <fcntl.h>
0 \* Q4 o+ X3 |* E: W
# n7 }6 y( X" P" }' T#define SHAER_RAM_BASE_ADDR    (0x80000000)
5 Y' L8 t; K: K/ U#define SHAER_RAM_SIZE         (0x20000)   # v$ y5 V3 H/ M5 w$ @' ]% w" X
8 q" o: \+ U  p. U7 K2 b5 g& p
typedef struct7 p  x7 p. h# h  u! _0 [
{: B. c4 Z# [" h! G# u% g/ c& o
        unsigned int a;7 ?$ \5 T1 j/ y& Y! _  \$ _. w
        unsigned int b;5 F% c" Q2 r" i$ w1 v; k6 R6 {
        unsigned int packet_cout;
; D) F/ `0 G# x) f}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. r1 I2 w1 ?$ q: s; W
" i0 s, o2 Z( Y9 T  w' V( \# d7 y
void read_MSG_buffer(int *baseaddr);
# |: x' i7 d7 Q5 S) e5 q# iunsigned int count_copy = 0;- N  n& x$ V( f; I# @) N

. J) n6 b7 O# fint main()4 N* B. d4 B! j2 y  Y, H, {
{
; y; S0 [0 s  S+ O& P        int fd;
0 @+ G9 M3 O+ Q        int *mem = NULL;8 _$ M8 ]  Y3 W! z

1 N# x& Y& m% S8 w        if((fd = open("/dev/mem", O_RDWR)) <0)
' H5 ]: y( b6 s0 {, ]        {
! r% Y; D$ E: ~                perror("open error");& U6 ]; `" Y- ~) d  X- |' C
                return -1;, c& C( }# ^5 {0 |: s9 r
        }9 i( H9 J8 w; F  Y
        ' a7 K* Q# d3 C/ W0 N
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);6 W0 d. Z5 W( ~! [9 @, b' `% J
% \" }6 Q7 Y; A- m
        while(1)* j+ d4 n; T8 ?* e3 a# @
        {/ G7 @5 f1 s2 e6 F7 ]# Z
                read_MSG_buffer(mem);6 B  f$ A) u  |
        }               
& Y, O6 |9 U) {6 k2 v' e3 G& u}
' b7 A4 A& L  c' ?4 @* _
  f4 h5 `' `2 K5 D% [4 ?: V, ^2 Svoid read_MSG_buffer(int *baseaddr)8 I" J8 L* @8 E8 S
{0 T0 i0 |+ s! J* h  y3 x4 i" I, x
        pRX_MSG_PROTOCOL pshreRAM = NULL;: i0 h- b5 c2 `1 Q; R: h& L& K8 J) J
' B0 i7 r, E+ y: J9 o1 g
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
. a6 E/ e1 b( P0 X3 H/ P8 W: B6 X/ D
& p; s/ J3 P2 |+ G% y; V8 }0 Y        if(pshreRAM->packet_cout != count_copy)& Z, N4 I8 O' n7 B* i# L5 E
        {) d4 q& A! J' b; w1 ~
                printf("a is %d\n", pshreRAM->a);
8 ~9 e  \: k! @) B# l                printf("b is %d\n", pshreRAM->b);
! U0 O3 E: P% }" r                printf("count is %d\n", pshreRAM->packet_cout);% o; q' P2 C: X% Y1 ?/ N, J
                count_copy = pshreRAM->packet_cout;
7 {6 l1 D; U4 e0 k& c& g8 [! g        }$ M! o3 Y; o. ]: N- ?
        else$ {  @' e4 }$ s- p- p
        {
  c7 P0 I, x) D2 ~) L1 [0 u                printf("No effective message!\n");' b* x* |; {+ v7 n4 m" b# q; j6 m
        }3 @7 |1 k/ K2 {, ~" E! J* L
}% D5 f* i/ s: f3 L5 @' C2 {+ i, a
6 o$ j; `' v) m( Z
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???6 s3 w' q- y# p: k
$ m9 W2 z: f  w* V3 T4 u* h) y
, M9 w0 J7 Y: l+ r. @

1 u, I, o' C7 J% k; G2 y* f/ H7 K2 ]% X" e4 A6 r$ m
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-20 03:57 , Processed in 0.045173 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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