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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
0 s7 e0 @3 a, M/ O! g$ H) K1 p. ]! L8 T* A* V! b
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>5 b% z$ r4 j! e6 v. W
#include <unistd.h>0 j$ V/ s6 V+ u6 \& m
#include <sys/mman.h>
- [6 i3 ^" w* F0 m1 X#include <sys/types.h>4 I' Q: c- E0 t1 }
#include <fcntl.h>
9 k/ a! _! r, |; S$ X/ d# b* E, F
* h3 A2 U* R: q" b9 `# C#define SHAER_RAM_BASE_ADDR    (0x80000000)   $ h& l' I  u4 J3 F% L+ [

/ N) ?# H. F; Q4 s% T; L, @typedef struct
- h( r0 D. Q5 H{; E$ n6 |/ w* S7 `' S: Q
        unsigned int a;' d' m- v, y; W
        unsigned int b;
7 z/ }' X( ~  Q        unsigned int packet_cout;7 C$ Y) S, v- E6 d9 [4 x) w
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
+ z! h2 d4 i5 ], S+ V  C3 o/ Z& a2 r2 o' m2 B+ L6 v
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
# N" g- h2 k% M) M/ W0 ?unsigned int count_copy = 0;
% U6 E9 ~( g8 j  |% E4 y# S: E3 K9 r5 w3 `( d
" |, C( E  ?% b4 x1 |1 ^2 e
int main()
% ?! Z9 L$ J3 f! d& u( |) g{
- }$ F2 k* T0 m9 j4 f        pRX_MSG_PROTOCOL pshreRAM = NULL;
5 n" V' A! X5 G) F6 S) f" t4 j3 P        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
4 P2 i. W2 t% y5 f7 T& e" b0 y2 p
        while(1)
1 E  k: c) q* T& H: S* A3 i8 Q        {* N2 ?, [$ q0 f/ Q' J4 Y7 _; ^
                read_MSG_buffer(pshreRAM);
5 g* f& Q5 d7 B( B5 }0 ~        }               
& N4 d& y' p$ [; _4 [+ K! J. i}
- g: Z& }4 W0 R" a& f
9 \6 f, T  m% v, c/ f- e* zvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)* z) p2 z  v& F8 h$ ?
{
1 ~% e# l* }$ z: E1 B7 Q/ q4 d8 v        RX_MSG_PROTOCOL buf;9 Y8 B  U! t7 k1 N+ M
          O% E1 D( X! s1 f
        buf.a = pshreRAM->a;
0 w. h5 L6 N7 c4 `        buf.b = pshreRAM->b;3 B" m- n' K, x3 K8 s2 r; B+ J  e# d
        buf.packet_cout = pshreRAM->packet_cout;
- d% ~, k2 O  G6 Q! T+ t7 M& F        
" _7 o2 }6 ]* V/ Q        if(buf.packet_cout != count_copy)8 u7 y" q  C# U2 E/ z) Q
        {
. h- b3 Y2 Z7 h' e" o                printf("a is %d\n", buf.a);
# X6 |1 b( i. r/ ]! F, E. J0 P$ f                printf("b is %d\n", buf.b);
+ i, S, |) f8 ]                printf("count is %d\n", buf.packet_cout);
& q" h& j- v7 M  u, W, G                count_copy = buf.packet_cout;
) w/ x% Y$ O3 A8 m! C        }* L- \0 p: V. c' a; y9 S* x
        else" X; A+ r! ?4 X/ L6 G& _
        {
$ t7 c$ Q+ G" h3 P                printf("No effective message!");
7 q9 J; W/ p  F0 g/ G3 I        }" |) t, f) ~# ~* n
}# R1 J/ Z& P  X  v# `

9 }* S5 U0 M# M' {# I2 W0 [7 ^! E+ C& ]9 G
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。0 r6 f0 D5 t1 @& f  ?6 `8 u
使用下面代码,对内存使用了mmap函数后:2 X3 X% t( f5 ~# k: k
#include <stdio.h>
2 C9 z7 Q3 s- x0 r5 Y4 Q#include <unistd.h>
) ^+ C3 C$ f/ q. g1 j#include <sys/mman.h>; ^( T/ y. O+ R+ J; X( ^+ N9 x8 x( u
#include <sys/types.h>
6 x7 G) Z) `8 W( S#include <fcntl.h>
% {, }2 g! V6 x$ a  O1 t
& s3 C5 P  K5 Y#define SHAER_RAM_BASE_ADDR    (0x80000000)* H: n# g$ i8 n
#define SHAER_RAM_SIZE         (0x20000)   
' p, }5 ~& n3 }7 z1 @; A
" d2 w; Z- z- ^; ^% r* Ltypedef struct
9 [0 o. C4 e6 w5 e/ _{
" k6 r8 b4 q$ X        unsigned int a;
% d) H  C9 b& |- G' S1 I$ E9 g  K        unsigned int b;6 x4 q, N* H; ]
        unsigned int packet_cout;( J# v  N* m( w: e
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 m) Y8 f+ ~8 i6 Y0 A
0 n# A1 t% ~4 k' B& Vvoid read_MSG_buffer(int *baseaddr);
1 Q8 J6 n$ n2 |( Aunsigned int count_copy = 0;
! _8 h, ]/ _8 R0 e$ j3 @
+ d+ m8 B8 K6 M$ ~$ L# }' \' x3 J+ cint main()
1 c; Z' r+ Z$ N, Z# R{
1 J$ G% a7 O8 Z        int fd;. U, n8 q' {8 ]/ A- G* M
        int *mem = NULL;
0 f2 e4 b  o4 J! u# ?2 P( o4 y8 }" h
        if((fd = open("/dev/mem", O_RDWR)) <0)
* a& K& e) W" O4 [; P0 e$ T1 S" W        {
4 z. W/ T8 E. ~8 w                perror("open error");. g1 Z  e. H/ n4 R# z6 A1 n) @
                return -1;
7 K; B: V  s0 E$ G# x% U        }
: ^5 p1 `: u* Q" C. u$ s        
7 o6 Y" [# V. o$ `( L( [/ _        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);( K4 p7 n3 Z, k  K) b, f( k
2 M3 J, }7 J) ?7 o7 R/ }
        while(1)2 {) v% S: g8 h8 y- R/ j; f7 _* x
        {
% E+ ?4 }3 L4 G) k5 `2 Y; g* ~                read_MSG_buffer(mem);
$ {) Q5 `. J8 A' _  {        }                  \5 |- d+ F$ ?
}8 n( _3 Z* B$ z; `5 b5 l

- G  E. E4 i$ v! v5 Ivoid read_MSG_buffer(int *baseaddr)
0 w3 Q; N, O& P# ~6 ?{
/ y* M6 B3 |, i5 F5 K6 o; r        pRX_MSG_PROTOCOL pshreRAM = NULL;
3 {! y1 K1 F7 W0 _0 ^; e7 k
2 B6 i7 O  x- ?! `        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;5 m& b( [7 N; K, q$ _/ Z

% k6 K. e6 t6 ]        if(pshreRAM->packet_cout != count_copy)
! d- n0 F% ~3 }1 n% s4 e9 H        {: b) B- ^- a, v+ h
                printf("a is %d\n", pshreRAM->a);
* m2 s( Z0 }3 X. `: }7 l9 p                printf("b is %d\n", pshreRAM->b);4 i+ Q; `! s# P! C+ ]8 C0 B
                printf("count is %d\n", pshreRAM->packet_cout);
0 G3 Z$ G' N* j0 r4 D4 F  e7 F                count_copy = pshreRAM->packet_cout;( b; J" j2 Y! f
        }! K& q( P4 ?% r' S
        else( P! U4 i" s- E3 c
        {% O1 w5 d6 a+ H
                printf("No effective message!\n");4 @% J0 C- t6 x: ^7 k8 E- c
        }
: \" b/ p( m- U! [0 B9 w}
9 t0 P2 v. P8 \! C$ [: s. G+ A/ _! g4 c- i8 \
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???0 s" s/ n6 S% h* N1 o

; g4 l# P! g, u+ f* `3 _' G) c3 O) j1 e# e
9 B/ }1 V$ {. T) N' |0 J8 @

& l* r( Y. A! a6 ~! ^# F7 r+ Z
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-9 12:17 , Processed in 0.035829 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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