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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 / Y* }! G! s" Z
0 x: u4 A0 B3 M. d
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>6 X* {2 e6 s" w- a$ j  C+ M
#include <unistd.h>
$ H6 {% j* K/ D$ c#include <sys/mman.h>
" R( G0 v0 ~8 \( `0 B#include <sys/types.h>  N4 {% v+ U* D" z+ a
#include <fcntl.h>& m  I+ |8 P! q2 ?8 s4 ~

( w2 D; q# t. a; _#define SHAER_RAM_BASE_ADDR    (0x80000000)   
% }; ]- p/ |+ ^, U. v, Q4 G5 R% N/ e
typedef struct
( U% V" k* H# f7 y2 T- o{) H9 E8 j/ E6 B
        unsigned int a;9 _7 Q$ A- C% K6 d
        unsigned int b;
& _$ z' D0 C5 V; v1 i* }2 h8 Q4 z        unsigned int packet_cout;
# z7 e+ A: U2 `! o}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;; p3 a4 n, e2 E& d% v9 ~% `: d

3 g' `  A: E8 ~- [% \: n* ~void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);+ t) v& B' o; K4 _
unsigned int count_copy = 0;' t$ G  t2 p( l7 u
. T  l: t& b0 e5 @! s
2 k0 b- V/ k% l
int main()8 _& ?0 b+ d, r
{
) D' `% J' `/ K1 W        pRX_MSG_PROTOCOL pshreRAM = NULL;
" Q8 Q0 z* _4 J/ [' t# X: A+ ]0 v" S        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;9 b0 N1 z' U, `$ G/ p8 D0 @. d( `

* |% |$ \& Y! E$ F3 C        while(1)
' ^8 l: }% |6 U- L  Y" x$ f4 }        {
5 w( _9 F8 m* M# b1 |                read_MSG_buffer(pshreRAM);
0 l, y+ V& [8 S) x6 |0 T        }                0 ]0 s: t4 x  Q( O; v7 J
}# C5 G5 X# M( r3 `# f6 T
! g' V' F0 e4 I, S( M# k2 t
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
( N" {# b4 X* g0 W/ }& E  [& f{7 H5 N) o& j$ }) X/ Y+ \
        RX_MSG_PROTOCOL buf;9 v5 i; X4 `" Z) W7 o
        
7 n# t9 @0 L+ ?4 \% h4 v: D        buf.a = pshreRAM->a;
9 J* z! U2 n& A$ Y3 w        buf.b = pshreRAM->b;
; M3 a0 k- z! Z1 @4 a  G& y: |        buf.packet_cout = pshreRAM->packet_cout;5 C* G3 p' h$ {0 X# q) E1 G0 K
        
1 v% y- T5 B1 a! ?2 U        if(buf.packet_cout != count_copy)
1 \: g! {& a0 ?" x& _2 q3 o# i- K  B& {) Q        {
: }6 Y3 a  ]$ q9 t  @! P! G2 i9 |                printf("a is %d\n", buf.a);2 A3 |2 I1 S* Z' M3 |: `2 @5 k( a0 @
                printf("b is %d\n", buf.b);9 p# K4 d$ q4 p  A- E+ X
                printf("count is %d\n", buf.packet_cout);
6 D, C$ H+ R) p" N( C: z# G0 e0 ~7 k                count_copy = buf.packet_cout;
2 y( R$ P, a6 O7 G        }
+ b* L2 X6 b! b- e& B        else
& ^! n8 \; b1 V        {4 H; z6 l) B( E
                printf("No effective message!");, e% u$ K7 E- O5 w. J
        }
  ?0 x. Y- ]2 t6 f% \6 ^. n# E}
; j) k% `, x6 c9 z3 N
8 v1 A- s4 X2 a0 `9 C: j* {  I: r$ C& N; Q$ u/ S* r' e0 {
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。, u5 j% W) Q4 s- n
使用下面代码,对内存使用了mmap函数后:
( t( S6 y9 ~& `* w2 S; y#include <stdio.h>; }6 b  g: D( K: v, w
#include <unistd.h>& \; [5 R: p7 k/ f, l! l3 B/ {
#include <sys/mman.h>; E: ?3 [$ G+ W! ~% _3 Y& E7 a
#include <sys/types.h>
% X5 b$ K- T$ w/ m6 J* B9 g#include <fcntl.h>9 ^+ ^: t' o: l
7 R7 t# y$ Q. J$ i2 j' Y- R
#define SHAER_RAM_BASE_ADDR    (0x80000000)/ T0 t0 r: F/ A8 D& G* L
#define SHAER_RAM_SIZE         (0x20000)   
2 m; S: ^6 y* R: C% Z' L7 S& M5 R3 |$ H& C6 P& l$ r2 E/ o
typedef struct( w+ b/ @  X2 }
{+ ]7 F3 m3 }; I
        unsigned int a;6 {3 S* g+ w" r2 {6 ^* I; p+ ^1 b
        unsigned int b;, K& k9 B2 z) z/ M( Z: G
        unsigned int packet_cout;
7 {9 n* R" D, B}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;: X( U. L% o, \% Y
2 }# h% {; G6 h9 Z
void read_MSG_buffer(int *baseaddr);% o( U" j% d) }' c
unsigned int count_copy = 0;
) H% x' b, K4 w& Y$ a3 o% g- Y7 s% }2 P5 z% K
int main()& u- P- D3 ~5 t5 s/ W# k
{
4 i- {/ n  _# a' q& y( {        int fd;; w% L$ H( M" p' J# _/ B
        int *mem = NULL;$ K1 R! A5 R9 Q2 o# H

6 {* j' ]% }4 y3 T9 |' I        if((fd = open("/dev/mem", O_RDWR)) <0); i2 Z- |" f, @  v& W* Q
        {
( q  g$ w3 i. x                perror("open error");
; s) w8 ]" \8 F1 u5 }6 U                return -1;7 M8 I. O+ o9 M" t+ F: R
        }
, O/ u5 Z/ h5 K* I( p7 W        - h/ b9 U! _) x
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
0 a  U( G1 d- ]9 v" K5 g/ S# W( N& a4 D4 Z+ a5 A0 c/ h4 i
        while(1)8 }( H* x, K- @% ]# y* p
        {5 G6 p- J* X5 G, y9 t
                read_MSG_buffer(mem);/ ]6 Y. E6 z- f4 O8 h* b8 k
        }               
5 |; ^; Z/ X' f  j* Q) v}
: c0 |9 k, k4 \- ]" @, _; P6 M
; F  j2 L3 e/ y+ s; n, Kvoid read_MSG_buffer(int *baseaddr)
  ]* v  N+ {/ U  M{
0 F) |# M* W, _8 C; j        pRX_MSG_PROTOCOL pshreRAM = NULL;
# B/ I% }( J. }$ |: D; g" n" Q: H% V+ }# O
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;0 {0 E- T6 O0 d+ F" x0 `
9 z, G! f/ \. g8 w2 d
        if(pshreRAM->packet_cout != count_copy)
; o. X7 `" f' W& z0 Z( [        {6 \2 M$ U) d( H! s/ ^3 D& l' T1 v
                printf("a is %d\n", pshreRAM->a);
- V2 L7 S3 b. P! q3 ~                printf("b is %d\n", pshreRAM->b);$ B1 U' J, ]' y, M4 M
                printf("count is %d\n", pshreRAM->packet_cout);* f# g- G' E( \9 X5 C+ W
                count_copy = pshreRAM->packet_cout;
" v8 m3 c$ P3 W! W        }. V+ q2 ?% Q9 K8 l
        else! K: U* o  x$ M2 i) D3 z
        {
6 h( c0 c' A* H$ G9 G                printf("No effective message!\n");  V" R. p- J; M, n) a
        }. [( [" D2 {& z( t% F7 Z1 ~
}
$ `+ E0 v! N6 ?( i* t
: p0 ~1 {/ e5 L2 Q$ l" u没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???% v0 Y7 S! J6 d( {  Q& c4 Z8 ?
$ i5 v. W3 h  v0 k) Z: P5 U$ d# k/ e

3 F) Z0 W- u; v7 [
1 N% g, Q% ~. n3 N' N. T! z) d
" ~, I& T/ K1 @2 T) c
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-7 14:57 , Processed in 0.041500 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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