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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 3 q) a) z9 D  n& J4 Q3 @2 F. W

: W4 C6 T, F) q8 V3 n4 cOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
) g. R+ F3 q; p, D1 W+ c#include <unistd.h>. y9 z- C8 `4 ?# k' p- J
#include <sys/mman.h>8 u+ R, [6 H5 z
#include <sys/types.h>; G7 w9 e7 h8 Y. `9 X, y! p& t
#include <fcntl.h>! n7 S. P: w! h" k! D" y
1 J% C3 ~. x9 R' `
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
6 K0 y' Z/ z3 I7 D
" @- Q, i2 \3 d$ x& Rtypedef struct/ K6 x# q8 W' {5 I* q, S5 A" X& D
{
3 Z/ ^, u* m- C. h! R        unsigned int a;; t9 K) {) W, w  Q4 r2 f* L, ]! t
        unsigned int b;/ Z( E7 m, r7 E8 l/ W4 s$ G$ B. r
        unsigned int packet_cout;
& s" e( s, Q- ]% ?( W- C}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;0 r% u3 s) i4 J8 w

% b; n- d7 M( l0 cvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
7 T! h' }7 t6 O# X$ Lunsigned int count_copy = 0;
$ x; i6 ?( [0 J' R, d1 r3 m; R  A' O& \! ^: P2 ^
. s% @6 i3 v; W+ i# v) Y3 I8 `
int main()! m" g/ r- w% g9 `
{+ Z. P: h8 }. [- y
        pRX_MSG_PROTOCOL pshreRAM = NULL;& o+ t" l, [3 o8 w% S
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;: e4 C( o5 c. }8 v2 N. ^

% U$ Q2 ?6 C, l2 W4 T9 H; |        while(1)
4 X  q# u# J8 Y        {
$ \% @' p' G3 f/ r                read_MSG_buffer(pshreRAM);
/ [' H  A% ~' E        }               
% ~( }& ?/ W4 _" d1 X}" y+ g7 ~: r& @# ?2 f
  p7 Z" X3 N; \1 g; Q2 C+ ?
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)- S% q: K$ O+ I) E/ @/ \! g0 U
{( s. V& O( a( J# U1 K! W
        RX_MSG_PROTOCOL buf;) ^3 F0 ?( M7 L7 O
        ; C8 B1 _: w' `# F1 @& d9 W
        buf.a = pshreRAM->a;" _, u; ~' ^7 B! {
        buf.b = pshreRAM->b;
* X6 f' _7 U3 A) J. d) k        buf.packet_cout = pshreRAM->packet_cout;
1 ]( E2 v8 Y+ [; P        ; F& k* ?6 I/ j# b1 A$ j# R* S
        if(buf.packet_cout != count_copy)+ z7 R# M' I+ W8 q% H* ~& l6 w% v
        {
7 ^3 l( H* p! O9 B' C0 |                printf("a is %d\n", buf.a);3 p  T- a) p' z$ c( }! @
                printf("b is %d\n", buf.b);
) x1 I1 x: T8 x. R. u9 J5 ~* o                printf("count is %d\n", buf.packet_cout);" D# t$ e6 U. w1 }
                count_copy = buf.packet_cout;
! v. s7 C* x' z8 [$ V        }7 f% F0 h: V8 ~  T3 w" b0 M
        else
8 ]' f; Y, N. n2 e+ a: K8 Y        {
0 \' e( g8 J: X+ h$ [& \                printf("No effective message!");  K1 O# q' @! I. e8 H" T
        }
( ?8 q5 U& l5 i* S1 G}( S( }6 u& j% V
4 K3 l! p& z/ G8 t( e

) g- [8 }  M; P+ t3 ]. Q( D但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
! }4 J& v7 G5 @8 @" C1 N% \使用下面代码,对内存使用了mmap函数后:
# j6 p& K* X0 R0 X1 k#include <stdio.h>( \! X' h/ B0 W% w1 w0 I
#include <unistd.h>
0 h# F  \5 O" J: H#include <sys/mman.h>
( V1 d$ Q, m9 _/ {9 @4 ~" b  D#include <sys/types.h>- ]5 E) D" B& u9 @+ Q
#include <fcntl.h>
. K0 j; B7 e3 ?5 t' D* u8 G6 r; c
" X7 N; N( p6 d( P, w5 U#define SHAER_RAM_BASE_ADDR    (0x80000000)
+ m9 i2 w$ i0 M3 z5 A) n#define SHAER_RAM_SIZE         (0x20000)   
& \8 e( Q) b/ f# i0 N/ l% p7 W) k0 x* r; e* Q- a9 T
typedef struct
9 ^0 F7 L- A5 A$ {$ M1 w{6 k  I1 C# j0 m4 s3 k
        unsigned int a;
9 b# t6 ^6 |7 W) w1 ]6 A! s  \1 u        unsigned int b;! P' I7 @+ o" H
        unsigned int packet_cout;& U7 W2 |- {0 h6 u0 x
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 x: ]2 T9 L; n; ?7 @7 R4 b4 W7 M
void read_MSG_buffer(int *baseaddr);5 \( W; L" I( H5 f/ g3 G3 v
unsigned int count_copy = 0;
5 p$ s7 v$ G( y, U$ c; W! e; t' R( a5 \* V9 i# Z, e9 L) S5 {# K) l
int main()+ \, j6 a( r' S2 N7 C
{  `" t/ _$ p% c1 x% J
        int fd;2 e8 Y& i8 v; R6 x
        int *mem = NULL;
% x% Q% f7 v/ e" \" A& n0 F6 q/ X) C' I& M1 x' M  k% i, {
        if((fd = open("/dev/mem", O_RDWR)) <0)
1 B8 G  D" Q' f8 W% h0 ]- O4 e0 j! c        {! @. M# ]. \; ^
                perror("open error");
5 M* _5 k2 W! M1 B8 d' e                return -1;" H# ?( ~/ X* g/ }
        }
6 K0 H7 Q. H4 A# K7 i. X& D$ O        
5 v  Q' ?% B) u% c5 P% ], h- l        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
3 a/ e+ o$ ?, L9 w  b+ x* u* G  m% ]0 R5 d: Y+ M$ a
        while(1)" k9 J( A2 t; W( q" S7 `
        {
2 T: J( Y' K) J# {% I' R                read_MSG_buffer(mem);
3 D( V1 b' I5 a4 `  u& y" D' ]        }                $ ^4 l2 o5 t% P
}
( F  m, y$ I; j/ G* H3 I; z1 e+ Q% V5 q9 y% t/ P3 _
void read_MSG_buffer(int *baseaddr)) g: ~" L. h' l' Z" [- |, c
{
) h  m5 F4 |5 \1 q6 w; Z* S9 [        pRX_MSG_PROTOCOL pshreRAM = NULL;! f! f* V6 Y2 p* W

5 k! k& j% {/ m( {: B; j) k9 t; Q        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;! q# U# f! G" G2 ]3 k
: B1 {- _$ |( ^
        if(pshreRAM->packet_cout != count_copy)
  H2 f/ i  y3 {        {
) {5 ?/ o' v5 \2 v% t                printf("a is %d\n", pshreRAM->a);4 z$ L  ]8 k7 w% C# e5 a2 `
                printf("b is %d\n", pshreRAM->b);
- N; S8 M) w, ~                printf("count is %d\n", pshreRAM->packet_cout);
2 T: g& f4 w3 n6 `$ m* q6 f/ Z6 Y                count_copy = pshreRAM->packet_cout;
4 |6 }0 t- @! S4 u2 n' k        }; c- v; x$ T6 O) X9 Q0 J
        else
1 L7 \8 A( [5 I( H) W1 s6 u        {: }; F3 P, U( }+ n. j
                printf("No effective message!\n");
( |. d) Q5 D; o' G        }' D' f7 ?2 V0 I/ A
}
) `: o) a  o* O) c8 w5 X! g; U( \, x7 O3 x6 Z
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
% N2 _; B4 W# B. @9 C
3 R" t; M- ]* l( c3 t! P; b' B
( U) w  V5 N' C, A! H8 r8 [, A7 \5 B
7 o5 S: c7 ?; N
0 d, ?. @3 S5 d
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-4-7 03:42 , Processed in 0.039922 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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