OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 & `  y% ~5 _% N$ J3 z( z; K

% o; k4 Q& Y" ]+ |OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>3 r; O, U4 u* z4 n
#include <unistd.h>
  D# Z& w5 v  [2 y! ^1 H#include <sys/mman.h>" I; l. \# o* q2 }
#include <sys/types.h>
8 e2 _9 n/ d% X) ~& Q#include <fcntl.h>
6 {4 E2 m) U2 Q: q6 Z3 e" d. R- y6 Q7 r1 l. S9 F0 d/ P* i- r
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
0 t/ I. s  g$ y, W( K# V& x: Z  _; k" M1 I0 Z/ Y
typedef struct, I- a1 s9 q  k2 j4 H0 g: W
{$ l  i( p2 \: V+ t7 U$ t
        unsigned int a;9 J1 E3 E; ?9 o; d: h
        unsigned int b;# E( {8 \, x/ A% T) ]: a
        unsigned int packet_cout;& k& y0 l2 x: z9 q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;" z4 U* P" a6 e2 l' l2 ]( f0 G) n
& C3 S+ D1 i' L5 j
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
/ r5 e1 j6 X- Iunsigned int count_copy = 0;
7 G5 i7 j- a; m. N' `5 W
  V) X: _# Z& x( t1 ~2 e7 P) L# R$ g3 w( n) B% }# w* L0 T
int main()5 i5 q) q7 T$ N' B7 S7 w
{
8 o' V9 J' r, U        pRX_MSG_PROTOCOL pshreRAM = NULL;6 U: l, x2 i" G$ f+ ~
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
, A+ P8 P& ~" y3 v! ?  c, N; f5 I3 o8 ^
        while(1)
5 ^# t# F5 K7 a  r- A; B8 Z9 h        {; T& m! }5 J2 J+ N" |0 J2 B/ m8 y
                read_MSG_buffer(pshreRAM);
8 {5 B) k6 L$ s  N# T: {  Q        }               
  \% m- W. u* P}8 f% o0 d8 w2 l6 J
. w! b- P3 Y0 S
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
, W: C1 t) P! @; J( P{; N6 [& I3 H1 {5 N0 }0 F
        RX_MSG_PROTOCOL buf;
) `/ C0 I' u! i5 Z7 A9 {        
, m3 R) W2 l0 ]- |$ s        buf.a = pshreRAM->a;% N2 ~( S8 B; L. v& E8 j
        buf.b = pshreRAM->b;5 q  @1 j- L3 L4 z
        buf.packet_cout = pshreRAM->packet_cout;$ i) j# r! [3 j  z1 W7 e/ z) W" a5 i
        
( J/ g( E3 Y9 k8 r8 k        if(buf.packet_cout != count_copy)
$ P- q' r" h; s% k0 W0 w        {
  J: S( y: f7 O3 g                printf("a is %d\n", buf.a);$ W- \- v9 y& O$ v( Q, M
                printf("b is %d\n", buf.b);
+ P" Y# U4 R4 b4 H                printf("count is %d\n", buf.packet_cout);
6 p$ m9 j) O* y) s9 @+ V                count_copy = buf.packet_cout;
- G) Q+ ^, Z( Y" x        }* c5 F! {+ w6 E$ y, n3 l
        else
- R6 }2 R1 }6 q1 h        {2 Z2 P+ z( ]6 r% I5 ]" K
                printf("No effective message!");
. f& N0 {" [1 H2 O3 A        }
9 L! N$ j% V+ b}& x& K) B- x3 D% d5 c: V* G9 @

9 _* Z/ L9 n- p3 N: T
8 ^! {, C5 g- D. L- ^( X但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。4 E6 }& O5 |- p4 h
使用下面代码,对内存使用了mmap函数后:3 s/ k8 s3 i3 e4 B
#include <stdio.h>4 O6 I7 [, R/ Q; S
#include <unistd.h>$ J$ L2 I0 |: G
#include <sys/mman.h>
# |9 O( Y' _5 ]) S, s  N; K#include <sys/types.h>
2 Y9 O7 ^" E  G' N# q; @, V#include <fcntl.h>
# `" O; J0 T0 V3 }2 H, I1 t4 v2 m" H9 B8 x1 u% g- n$ I+ O
#define SHAER_RAM_BASE_ADDR    (0x80000000); ^8 \0 B" K- u  s. x
#define SHAER_RAM_SIZE         (0x20000)   
# @2 S+ W, u# d, o' b+ e7 n4 a, f0 W# X; r/ ^: a. d9 b
typedef struct2 s. C6 E, K& W1 F6 w
{# E5 b+ P& n$ R* S4 m- x! {& `0 z
        unsigned int a;9 E. g9 o5 T! |2 V/ E
        unsigned int b;
- c4 o" l1 n7 ?. O        unsigned int packet_cout;
3 k" O! T, ]. `+ d8 ?* Q( u! j. ?6 S}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;$ L% l: u, a, F0 h: ~+ B$ h

! K# I/ {; ]6 x) y# u- I2 n: evoid read_MSG_buffer(int *baseaddr);6 f0 T1 Y" }/ N* T0 L+ V9 ^: p
unsigned int count_copy = 0;
3 O2 x( y8 e# v; y& B& n. ^* {, Q8 ?5 C6 O7 w
int main()# z, q! d8 q9 t+ f# e$ [
{
+ }+ j) g) L% B- e$ R% w6 m        int fd;
. a$ B; N1 N$ ~" q$ F        int *mem = NULL;
& D* T( o. C' c2 e: W; z* T/ K. z. j/ s
        if((fd = open("/dev/mem", O_RDWR)) <0); G" U8 A4 K# n9 z+ f( f
        {. Z4 ~" k" ~! P7 p2 U/ f# Q* l
                perror("open error");, h" D' Y2 A+ M6 }. t/ m7 A! I8 \
                return -1;. ~, j6 z& h- X4 d1 M/ n
        }  ~! T! l. }: E& t) m, A+ U
        2 P9 [$ W3 x& @* Q  S8 {
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
' `3 f+ N- u0 P5 n4 ]7 ~% Z
/ ^! I8 A* B+ t! t* D        while(1), Y% ]# v# i, T* W# `
        {
8 A# s' X+ \, b% `: E+ q: i1 ^/ }' I2 I                read_MSG_buffer(mem);/ D( k5 Y! ]- c( @
        }                  u  ]# D7 ?1 \' ]& c
}
- }( \$ K( V) J- P
3 l% h5 o5 K' I  B2 W( ~+ V+ W+ ~  {; Uvoid read_MSG_buffer(int *baseaddr)3 H; ^. v" c9 H& k( X( @
{# h0 t# {! t6 J" |) @% K
        pRX_MSG_PROTOCOL pshreRAM = NULL;5 j0 H6 j: E# g2 A# B# v
1 g5 ?& d* Z/ p- `: z
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
; o/ ?  L$ v4 O+ I3 u4 F  M
/ `' q/ `) g- o! L        if(pshreRAM->packet_cout != count_copy)5 a4 y# ]5 N( b3 Y
        {$ h2 ?: [  e% b: _4 g+ s
                printf("a is %d\n", pshreRAM->a);9 p$ r8 W2 s+ \% e# ~+ q4 _' K
                printf("b is %d\n", pshreRAM->b);
, l! j- r( k- ^                printf("count is %d\n", pshreRAM->packet_cout);8 q  w: w# H6 c( t7 S5 C
                count_copy = pshreRAM->packet_cout;
+ _) h$ E; I' v# Z9 M! x* h        }
+ V" d5 v& [) l0 ]2 p        else
7 H5 p  u& h9 r" U1 C2 n        {) |4 M+ e& O* H* N. W5 M
                printf("No effective message!\n");/ w+ B8 I1 g5 A9 c3 F1 n5 B6 l
        }
  p' ?# o/ f) U) J+ G9 V) z. d}
/ C5 L" L. P8 P4 m+ K. J9 Q
3 N# U6 E9 S" u& F没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
; v. p# @" t5 n- a  A  n# u0 t5 ?, J( |5 n& j' j% Q, e

/ R9 W6 C2 Q; e9 X* k6 b
! q0 M! Z' Y* N5 I+ j$ v6 B
6 t- ^9 M" \& ]7 i
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则


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

GMT+8, 2026-1-12 12:34 , Processed in 0.041280 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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