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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
/ J2 E' h! `: E1 _
( I5 B: p) [: i5 uOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>- W: K# C! D- N7 f9 Q% S' e/ s0 ?
#include <unistd.h>
. F4 S& p8 A6 p#include <sys/mman.h>
) ~3 _, M; O1 A& H#include <sys/types.h>
! [/ ?& r; X' u4 O; ^& l& @#include <fcntl.h>
! C4 a' J7 x! @# g
  B0 ^. K: N2 Q( i- \! q1 k#define SHAER_RAM_BASE_ADDR    (0x80000000)   3 b) U1 b+ n! F: Y5 \( p9 T

; F) D+ X+ F, X" e& ^! _typedef struct  e: I3 Y: [, _
{3 Z/ r) ?/ `0 h6 c
        unsigned int a;
# ~* e3 m! {4 G, L: H: S& ?        unsigned int b;
8 ~  p1 s- w% h4 s4 U! ~; Y        unsigned int packet_cout;8 H( h4 `0 l3 Y5 k1 Y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;4 `" k% |9 y* t! D7 H/ J1 W

& l$ w8 h. V- B, |4 R* d* ?+ qvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);8 |0 W) g% B" d
unsigned int count_copy = 0;
0 F3 Z. A$ W0 ^7 B8 \2 u8 l8 i% t! m
$ ^& \8 b. ~/ c& q4 ]( g9 K0 R# Z- b! K
int main()) x) U. U: k! t" {% T2 x$ U# n
{
6 Z" X6 i: \2 h* u3 Y2 i' n        pRX_MSG_PROTOCOL pshreRAM = NULL;0 N, _9 P" b9 W5 X1 C8 x, Z
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
, O1 q/ s1 T4 ~( d  e% P3 r% n) z2 Q: v! S$ h5 m$ j, ?  b4 ]
        while(1)
4 d% v8 y0 R+ W' y- L        {
! u& q1 D7 r  }5 V9 b8 j! Y                read_MSG_buffer(pshreRAM);3 Q  P% ]! X6 Z# a" a& x5 L
        }                : b' v  |5 S+ P) s$ e1 P$ ~; c
}( w  \, R' n" e# {$ |* C

* Y* U/ v, E. O0 [0 ovoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
$ ^0 U/ i2 B$ a1 p- _{! m3 X  s1 J! |3 v2 h6 R6 k
        RX_MSG_PROTOCOL buf;
1 q1 K& d9 t/ Q- N4 q        
, d+ b0 G2 e5 [/ N$ t3 P) {" W        buf.a = pshreRAM->a;
* W0 ^+ U* o9 |# d' f        buf.b = pshreRAM->b;
0 T1 I& z5 \0 {: q% m6 i( s        buf.packet_cout = pshreRAM->packet_cout;& u' @0 Z1 {/ @" E- \, K, `
        " @. n/ }- {# C9 O/ T5 P
        if(buf.packet_cout != count_copy)
5 M8 S. m3 R. T        {
( t$ v7 e/ Q7 F' o                printf("a is %d\n", buf.a);
( x7 f6 I" b3 e7 R                printf("b is %d\n", buf.b);* E( a+ U2 W6 X
                printf("count is %d\n", buf.packet_cout);
3 b+ ]0 ~4 t2 f2 [# z                count_copy = buf.packet_cout;8 u' T" e! l  L7 ]" k9 H
        }
/ M, E" [2 p+ o% Z2 w7 I1 f        else! H, Z8 q9 J( |
        {% \5 K4 M& n+ P, o% t9 v: @
                printf("No effective message!");
( K* H/ }4 N8 v        }
2 p! q7 h5 {# ^7 Q, Q}
& U6 W% P* P9 }# h
  u8 ]0 \4 R# W8 d, X8 A; v. w3 S' g- v( U6 g8 o7 Y7 f, n2 q6 O
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
/ n" L# X8 n8 B0 C7 S0 P使用下面代码,对内存使用了mmap函数后:& b& G, q; b" W% }
#include <stdio.h>
0 c; p* p' c9 {6 }#include <unistd.h>( N- p7 C  Y6 [8 Q. V  b* p
#include <sys/mman.h>- d) X% o' ^( A2 Z8 B* X
#include <sys/types.h>: f, D; F9 h; l$ f5 Q9 Z* R. [
#include <fcntl.h>
$ W4 b$ B; \! ?! ?5 a# t4 r$ h/ y5 W) H' J% g7 g+ Z% l0 I
#define SHAER_RAM_BASE_ADDR    (0x80000000)8 N4 L$ D1 Z" t4 U/ e8 J
#define SHAER_RAM_SIZE         (0x20000)   & p( v6 Q* a) D% n4 d1 |

7 A7 X/ B, w3 Ktypedef struct
" i  ^) l$ L! H7 {; j; S5 y7 u{" J" u; g7 K# B' l) R* R3 m
        unsigned int a;/ S: m  b+ Y$ T! v2 O0 Z1 l& A) g
        unsigned int b;! `5 V0 j0 Q0 ^6 ~' L% J" Z4 n2 H
        unsigned int packet_cout;& S$ V4 M& z* T# U( w* |
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 e1 W/ Z+ z8 h& K7 D; A5 h1 P) i/ u9 T3 P; w/ b
void read_MSG_buffer(int *baseaddr);" Z, R: k0 \3 e$ w$ d; `
unsigned int count_copy = 0;4 u/ B. i5 \0 S; K
5 Z1 A7 |$ P; a% n# R, E
int main()5 ?2 |/ b6 `3 t3 i( D  H2 P
{" v9 \9 n, y) h- W
        int fd;
( t; X1 V7 B- v1 E# |3 t/ ]1 {        int *mem = NULL;
- ~3 H  ]  Q1 A3 z' Y1 J* D5 |/ j+ P0 s7 L
        if((fd = open("/dev/mem", O_RDWR)) <0): V. p% O  R1 {
        {
( U% O- y' z2 a4 y  s, r1 I                perror("open error");
3 W( J. e8 K% r8 K6 ]# @  A                return -1;, v# P5 Y8 `7 j9 Z7 r# i& d9 S5 Q4 Q0 @
        }
8 @" i/ U" P0 l9 |$ R        1 @" b4 }; p1 S
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
0 h* H8 Z4 N9 O9 ]5 {: H% w$ s
6 w  [- j" |% L0 j2 W        while(1)
8 e  \1 t" g' @% E  }7 q        {
6 U7 c0 E3 I+ @" \* l- C                read_MSG_buffer(mem);
) g- z. I$ K9 g5 \- \        }                ) a1 s# [+ _& `& H8 _
}
$ S& a7 @0 H/ c# B( {, v7 K& \6 m3 ^1 M  L( s8 d' O0 x
void read_MSG_buffer(int *baseaddr)
9 x0 l5 \: j: A& i+ n{
2 s* t# W# d+ W8 _        pRX_MSG_PROTOCOL pshreRAM = NULL;, n7 n: a. z# D/ \

$ y) @2 L0 P3 W4 ]+ v9 F7 \9 ?        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;: T( S6 y8 h  X4 _! m  @
* @) U( Q+ _& O. W
        if(pshreRAM->packet_cout != count_copy)
: R/ I, f5 }8 M* _        {9 S# N, w7 d4 m9 m" h; ]: ~  b  N
                printf("a is %d\n", pshreRAM->a);: r6 z/ D/ @8 Y- d5 Q4 z
                printf("b is %d\n", pshreRAM->b);
, `7 A0 Q- [7 I- C& |7 g                printf("count is %d\n", pshreRAM->packet_cout);& I' W5 L6 k" C) F& C
                count_copy = pshreRAM->packet_cout;: ]& q5 P9 `" @  ^
        }
: O# y& y# f, d- I        else4 U, c3 y# {; y) M' ], _
        {( {/ U# T6 G& F/ r; _
                printf("No effective message!\n");& Z1 V3 ]6 p7 M9 ^" G2 ^
        }0 H0 _% x4 Y6 y3 J- d% Y
}, j1 Q. Q5 d; s7 M" o, l" @- y
  a7 S0 L4 b+ F1 u8 ?3 F: s" |% k0 @
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
- f; }  e2 l" ?. x% l2 s1 `
; Z* n( J3 ^# l/ e3 S* m% D+ F! M4 v6 ]/ H4 z% R

. b' j0 h3 {- D% M. {3 }. H4 U, t3 V  E6 U+ @+ S& G
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-23 00:56 , Processed in 0.048640 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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