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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
6 Z3 B/ _( |) H- F" p; i7 G7 u( p0 k7 F2 A
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>: }+ i( J/ _+ g! x
#include <unistd.h>( |, \, X! F$ L2 ]: h/ c4 E
#include <sys/mman.h>8 e) X; }. G3 K% S# Q6 |* ^
#include <sys/types.h>: x2 u; g' w+ ]7 U2 H
#include <fcntl.h>% A% Y+ q, ]1 b3 U$ I+ N
# H$ K+ {+ ^# v* ^
#define SHAER_RAM_BASE_ADDR    (0x80000000)   , j9 e: i( P$ Z  d" I

2 m: P. m2 x; H2 q4 ltypedef struct
+ ~+ L/ S; g! [) h: W{
2 Q5 E9 x8 Q- a/ C& f: y        unsigned int a;
6 q) K3 Z$ ?9 h* }' \* H        unsigned int b;
* B6 A7 E+ P$ f/ c        unsigned int packet_cout;
: [4 u. V6 i0 r. n9 e}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% h8 v1 `% ?  ^9 Y; `+ C( O, D+ r9 h* `. }& q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
8 w* U3 W) l) {4 \( w  U" ^unsigned int count_copy = 0;
% K9 ^2 _) e- s' w3 M; W- k, t8 I- p# A9 D6 C, }! w- f- B
9 R; j6 L* u/ x7 _- }7 \2 A
int main()) o5 U7 ?" N; B+ D7 ^0 U) W& p; M8 g: H
{
6 f5 [) L; s# R        pRX_MSG_PROTOCOL pshreRAM = NULL;' t' h) E% C3 K6 a6 p5 i; r1 E9 A( E6 N
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;$ s4 R: m! |& z8 }* t4 u) ?2 J7 j
, ~# l# }" Y' D2 p
        while(1). W7 P- m! e! w( c7 e/ y/ T
        {7 W: }1 N) n' x4 q+ ?7 e2 i
                read_MSG_buffer(pshreRAM);
  ^& G1 v6 ]# r$ b3 E* @        }               
: M6 y6 M2 Y' k9 h' }9 C}
) i/ v$ o% v1 o- }" ^) D1 q
8 [+ t# g. k6 i: u3 e6 `void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)) u% k9 u8 s3 ?( D, H
{7 k4 l; c) K) C. J( d1 ]7 h
        RX_MSG_PROTOCOL buf;
0 ?8 e; ]1 F6 V/ I        6 h" S' [! x; f! r) @" O
        buf.a = pshreRAM->a;  c0 H6 C# N" n
        buf.b = pshreRAM->b;' ~9 B/ Z: T% E5 K2 z0 R; z( W
        buf.packet_cout = pshreRAM->packet_cout;3 y. c3 `/ h( z& t# i
        ! L4 g$ S( @  z+ h
        if(buf.packet_cout != count_copy)" D& ^. O) S6 s$ o1 d
        {* U  q9 j* T) f" M) [4 M/ O  \
                printf("a is %d\n", buf.a);
4 G8 P1 }1 _7 x7 {6 {9 c9 }: q* C) V1 X6 H                printf("b is %d\n", buf.b);
3 O' f& j2 y/ `. ]9 `( t6 F                printf("count is %d\n", buf.packet_cout);
0 `( n$ N6 t+ C' g* m                count_copy = buf.packet_cout;
: v% l$ G1 H0 R: n        }
" e9 B/ P/ Z3 N# p5 J( T" c        else0 C- Y$ A) b* a( z) S* Y
        {. v4 T; W2 n5 P/ |8 ?8 |' r
                printf("No effective message!");! o' |* ^2 c' w/ R8 c
        }
; C, r% g0 P* {0 f. M- `! H$ b}0 @2 l8 X  T1 U# M  z' [! X$ M

# S3 ~. d" {8 h8 V( k1 {! I* o
" {! ~2 `! N! ~  v$ c& `/ q, @但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
, l  O: }# s$ y+ u; g( Y% ^使用下面代码,对内存使用了mmap函数后:
$ D; w- Q4 ?5 Y' i, [8 C! P#include <stdio.h>3 J+ T4 M5 c1 h$ ~/ H
#include <unistd.h>
( M+ h, i1 y, T9 Y* L#include <sys/mman.h>
8 v; {' W4 p5 O% ?' d# ~% Y) {#include <sys/types.h>
: J! z& s0 f: T6 r( q; [6 }#include <fcntl.h>
% u/ }2 ]$ ]& X8 S3 e+ I7 ]2 _& r, s9 I+ S) A$ m; ^
#define SHAER_RAM_BASE_ADDR    (0x80000000)5 F) w( K7 H0 i4 g' r6 _  H
#define SHAER_RAM_SIZE         (0x20000)     h9 b6 P7 `. \" X+ `, G
6 b1 ~9 p1 [6 A8 i
typedef struct! w6 F/ P. C9 X# D2 q# H
{
/ t$ W# U% U& Z8 Z! A5 O        unsigned int a;5 f5 M' T3 I7 \- l( \
        unsigned int b;
+ D2 Z( W  ^; p+ B) H, g: F        unsigned int packet_cout;
* y7 e0 c& T4 H( s5 M! |' j& H- L}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
" O1 t; A- o7 y0 t5 i0 s6 L% ~, L& m7 e  l0 ]1 `. I5 Z0 o# a
void read_MSG_buffer(int *baseaddr);/ u2 M) }# s+ C' }
unsigned int count_copy = 0;' m- [$ T$ I2 m; q& B  E
0 U3 w( K. n! T" z4 Y9 i7 H$ b1 T# o
int main()
+ Q) t8 R/ m) R: K{
. h- ~* G- E, Y: L9 c5 X3 E        int fd;% h+ l5 i" a2 |3 _
        int *mem = NULL;/ D- y9 P  M. p% F7 }" W  \' K

# C1 q8 t' d+ J7 z0 k; L) ~        if((fd = open("/dev/mem", O_RDWR)) <0)1 B  w* {$ m( }. X, @
        {
1 T, c( j5 d0 @$ `- ~                perror("open error");/ W7 S  T, W/ }' ]' Z
                return -1;6 a0 o& B- W; K+ k
        }+ m) t0 G( P) W$ [7 V5 J
        
$ ^; |! c' a) g, P% e: _) e        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);- W& t; L. r$ `" u% t
2 R6 `( }& I7 j* C
        while(1)
1 a; l" I/ u/ S) i, S1 B) k- R9 u        {+ h+ L  F1 i! ^7 Y( s
                read_MSG_buffer(mem);" J; j8 u+ g2 q6 Z  i5 a
        }                + T+ k. t0 C3 j! }
}, r: Y5 G( ^" {' I( Q3 g- o2 W

9 U' H$ }* ]7 N7 T$ p% cvoid read_MSG_buffer(int *baseaddr)( D# ]% w) @, ~: g2 {1 Y
{
; K7 `% Y- f. f. ^# O        pRX_MSG_PROTOCOL pshreRAM = NULL;
. T/ _' m% V9 b3 O- Y" h5 V( g) e+ X; X. C  Y& |* J
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;- C$ t* w' k: \
1 k  u2 F7 F' `9 E. M- X# I- h
        if(pshreRAM->packet_cout != count_copy)# i8 V8 Q1 W: m
        {2 w/ S8 g4 u3 g/ @
                printf("a is %d\n", pshreRAM->a);
( g; a0 V7 d9 c! y  T! |6 u1 e! L                printf("b is %d\n", pshreRAM->b);
% Q$ Y  L4 j/ M4 b8 l- }$ r- B                printf("count is %d\n", pshreRAM->packet_cout);  X+ ?% ?, m4 u0 c& L. I1 [
                count_copy = pshreRAM->packet_cout;+ ~# e7 @3 c7 {/ u" {
        }
( u/ C) G- ~; I. _( a        else6 r6 `# D" s4 r" g
        {4 j" b* d# N1 X+ ~1 e
                printf("No effective message!\n");. |; \3 U, [5 q2 {# L6 {
        }
4 N4 n7 i4 U7 H$ ~/ u) p}: q- a* f) `2 e. Y* R0 m

& B! R: C" s2 K没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
, c4 V) K" g4 X- Y( q
& D- p# X: \& M
! B7 H  n5 i! M: h2 p  [8 j! g1 k$ A$ p, d; k  v6 T
0 m" S: o% ]1 _: Q
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-10 18:37 , Processed in 0.040382 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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