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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
. d" T7 R3 g% i2 p
+ O( t; [( L' D$ FOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>5 z4 M( R% j2 o% Y0 H' H6 g; ?- [
#include <unistd.h>4 J) `3 ]1 N0 o, x0 H
#include <sys/mman.h>$ ^! A/ @3 s" ?* @
#include <sys/types.h>
7 M/ V" S( ~" u! l6 I#include <fcntl.h>
' p8 x" y) x: ~6 t
1 ^9 E& d2 P" `7 ~$ v#define SHAER_RAM_BASE_ADDR    (0x80000000)   ) y2 _  b7 j& [% J
* \+ D5 f  R: c$ Y9 s! ]% u
typedef struct
  R& B* t" A7 l{
5 p* P8 h- U" k7 _: ?        unsigned int a;
8 t7 k4 {% b# K" `5 N. K1 e2 m        unsigned int b;. z1 ~, P# y1 N  j; e
        unsigned int packet_cout;
$ J! v6 L. v5 O/ Z6 e}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 j! g. {# c: q8 D9 ~
) w, {" M& }$ P+ W) k& Xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);4 u8 b: N8 O& u% ~+ M1 T- M" s9 L
unsigned int count_copy = 0;
9 F) L7 B$ P6 P) k+ z/ P6 ]
* y) H; K$ G8 _) d% m- L2 Z8 c# N; s( _7 z! F6 F* \8 i
int main()
3 }% U0 L2 y  f3 v: f{
# A  s1 o: V& G; G! J, T& h2 }+ L        pRX_MSG_PROTOCOL pshreRAM = NULL;4 e$ V: _" h3 Q, c
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
2 l3 I# X+ r$ `0 h
! ~- A* {9 |; g        while(1)
3 Y+ h# `; k& n: r* ?0 s        {1 j* ?- q0 @4 u% x
                read_MSG_buffer(pshreRAM);
, Y. T! h3 C5 t% a2 p% f9 M        }               
* i3 @5 M7 Z0 y0 n. x* A) Y; g) A}) _: Z( D7 Z- {7 J; W% \% Y
0 M# f4 [, d$ h  g
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
* |3 A) M3 u# a, O{. l, c5 J3 Y" p+ P2 [( k. C
        RX_MSG_PROTOCOL buf;7 |' l8 k, q, ~
        
4 u3 m, D* e  N6 T; E! ]  b  R        buf.a = pshreRAM->a;+ ]1 {2 N4 p  D  [- I" X! E
        buf.b = pshreRAM->b;
. _5 K( p; R4 k6 A3 L# H        buf.packet_cout = pshreRAM->packet_cout;
9 n9 ~& l7 p6 H2 h/ i        
( E* @$ H' J4 n/ N; m        if(buf.packet_cout != count_copy), H. y2 c+ x$ P1 q9 r+ W. o
        {
" V3 |6 m- y2 e0 i' n# \4 i                printf("a is %d\n", buf.a);$ E9 `6 {: |/ ~3 L5 C
                printf("b is %d\n", buf.b);, J" ^7 E. C$ g' s# [
                printf("count is %d\n", buf.packet_cout);
7 ]+ e# @: H  j( R' f                count_copy = buf.packet_cout;
1 K& d/ b  s& Q7 n6 G/ I7 M        }$ T2 j" I1 o, E  s
        else
; s7 ?! E6 X) g( |$ g        {
- \! L$ g7 j; K. f. a; f                printf("No effective message!");- M* y' \. @: a/ U% Z, a
        }
. @" ?: X. n1 `4 p% w" F% `4 n}6 B9 ?0 z$ m9 _$ }

1 c2 W, t, l  `1 ^( g$ D+ b/ u) r
9 g' W  V& L$ P; `+ |. K4 T但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
! q6 W7 w4 X7 b' N; H! m! a使用下面代码,对内存使用了mmap函数后:
) W; X6 D% }& e* M#include <stdio.h>
0 M' f2 H# q+ y- f/ U$ d* Y9 K#include <unistd.h>; B8 G$ v6 R+ v$ U; a: k3 v% y
#include <sys/mman.h>
6 _0 f' w" l! o7 `. w#include <sys/types.h>* ~& e; j2 h. A3 d2 V$ ?
#include <fcntl.h>$ L2 A' p/ d' q2 }- M
* j) `3 m! y  Q7 U8 x' m
#define SHAER_RAM_BASE_ADDR    (0x80000000)5 ^/ D! @. J( X7 C. ?5 E
#define SHAER_RAM_SIZE         (0x20000)   
! ?, h2 J, m# H8 z/ q  l" p- w7 r' I' b& c4 {
typedef struct
- \( _* c5 l4 x: H) \{& J- Y5 X. R: i, A9 q
        unsigned int a;
' Y# _% N( v% V9 N        unsigned int b;
; Q6 ^3 N4 b8 f4 }        unsigned int packet_cout;2 u$ |( l2 e: l  l0 K; X
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;& I. u. ~5 t2 Y, X: c) ?3 D$ z

9 q" J% n4 V. P( r7 Yvoid read_MSG_buffer(int *baseaddr);
$ }7 v8 [: u5 tunsigned int count_copy = 0;
' O% x: o& B1 X, z, P/ ~7 R9 U- S( N2 \( X6 T
int main()6 Q" o& k  S3 ~/ Q8 V4 _
{+ a8 `, w/ S" [
        int fd;
/ ^, M3 _% }1 K: F- T4 y, Q        int *mem = NULL;
, m9 i( Q  e+ T. I9 d
' _2 B& b& B/ X, n8 _        if((fd = open("/dev/mem", O_RDWR)) <0)
& k& X! N% v4 w        {. u8 N: ~4 h6 R" n4 J  Y" S) I
                perror("open error");. y9 H# m" j/ c& ]5 g/ x
                return -1;
! Y; F% o. }% R& f5 x! X        }: N# [; S# o+ i
        9 u1 O5 G/ _& t4 Q
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
: D- z3 z. Q+ j( x1 g5 b' r0 t/ B% f6 t+ O
        while(1)
2 A; k. ~5 d9 B        {
5 N; z5 z$ y1 A1 q2 O                read_MSG_buffer(mem);( h; T* a/ w+ H3 ?2 G7 ?( x! e# K
        }               
7 W1 z# l/ I; \5 [6 m}
5 w4 e- b6 t4 ]9 I
. G/ K3 a3 f' t7 l; ^0 \# H. k, O1 mvoid read_MSG_buffer(int *baseaddr)
2 E6 \- ^  L8 Z' t" J{- W9 l4 \$ B/ z" m' }5 k
        pRX_MSG_PROTOCOL pshreRAM = NULL;2 l, G6 o9 }2 ]8 M
3 R2 I- \' S1 A% M' t0 _6 {- [! \; e
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;; p7 v7 N7 ]- M4 Q
& }* B8 a) S" \3 X- H) x
        if(pshreRAM->packet_cout != count_copy)
/ Q1 T. l& V. \7 S/ q. {        {7 _$ j3 x# c  |+ n: K
                printf("a is %d\n", pshreRAM->a);. n- R" A. Y: S* t7 [' ]
                printf("b is %d\n", pshreRAM->b);) D( q& @: c" M  k
                printf("count is %d\n", pshreRAM->packet_cout);
  d4 I4 X& E! T6 Z                count_copy = pshreRAM->packet_cout;  s0 T' d: P1 G. u6 Q+ U' _
        }
1 w5 q9 ]4 g; Y- f        else3 M  {+ d  w* _2 q
        {
' r4 V+ E/ f3 ^/ A; X7 p( I                printf("No effective message!\n");; ]! C. A9 t# N6 O* w3 M% f
        }9 V4 {- ]4 P2 y
}, I7 T8 Z' l% H3 n! B8 [

1 w; a0 G: B. \+ h; {8 ?3 p没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???: X/ _- k3 g6 ^* \
+ z7 F5 {  O+ z) B2 H; G

( [8 W/ T7 v* @% H" r2 @9 O
, K: z8 v. g+ b2 D; X. v* r$ c7 y! [6 X3 `3 `3 }- R
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-25 01:16 , Processed in 0.040824 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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