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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 1 X* J! N, y$ Z! ?7 U
+ h* W' l& I2 _; Q9 Y
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>; x, F* A1 z. T  @' B
#include <unistd.h>3 I4 U& t8 w4 g8 p8 k
#include <sys/mman.h>
  E1 h' d. s" v1 O) @#include <sys/types.h>
' Q- `; ~) j+ ^5 a7 `$ a#include <fcntl.h># X7 x* @1 J$ U4 Z

4 }1 M4 z  ?* N2 x( N' m8 o6 v#define SHAER_RAM_BASE_ADDR    (0x80000000)   
2 z2 x6 n8 w! G/ `
0 _* D/ \7 {" V7 o. ]2 Y! H1 Stypedef struct- w( m7 W& w( w$ D, K
{
8 y$ C1 @# u" u. w2 o) j$ ]8 N        unsigned int a;
+ d& J0 m. u$ |% R9 x        unsigned int b;* q) E5 v, b4 k4 G
        unsigned int packet_cout;0 ?: Q" m$ y7 e0 P; j- V
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' d: y% b# ~/ {! t5 b& }5 h: d. m6 z0 y; n- t- A1 {
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
. w% w4 u, w4 H' Aunsigned int count_copy = 0;
8 b' {4 S0 q* r
1 }" B+ P. ~) S6 f& w6 G* Z
9 b+ C; b' k1 n. I# y* b$ A6 mint main()
$ A5 [* i, x4 T! u4 [{( e" ~1 @( [' u/ p& i( H
        pRX_MSG_PROTOCOL pshreRAM = NULL;& i) b' J# `6 C8 Q( N
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
5 _4 b$ E- z) @" d: r9 Z- h9 E" G7 \6 }1 s$ _7 x& D2 @: L8 V& B
        while(1)
& O. Q+ N- a1 q  L# V        {
) ]8 g% f6 V0 c9 B3 N                read_MSG_buffer(pshreRAM);' e1 k5 y, W2 T( ~3 U+ C
        }                ( V3 z5 a4 Z& y/ z
}
# k- F5 V( l8 c
  a5 \( U1 E6 c5 S6 [* S% o+ xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)8 T% a6 u7 d8 _' H3 i% R3 N% G9 V% ~
{
  U% g  E' n2 a6 r) l        RX_MSG_PROTOCOL buf;
' r/ V. a: H% W+ \" [        . n8 Z3 Q. _$ h) U
        buf.a = pshreRAM->a;
: B9 l) [# c' c6 ]* x3 _. W2 Z        buf.b = pshreRAM->b;( o7 |9 O4 f; m8 s4 f2 J3 P+ ~
        buf.packet_cout = pshreRAM->packet_cout;* B+ S, K. o% S6 F9 Z
        
1 j) S0 M, }) R4 L+ j        if(buf.packet_cout != count_copy)
. C0 k7 F/ N! }9 L& H" U        {  S  o, h: P: c% e
                printf("a is %d\n", buf.a);
  d( z$ s/ w1 Y) K                printf("b is %d\n", buf.b);
- U. |5 q) I9 `- ?1 c                printf("count is %d\n", buf.packet_cout);
+ ?% F- @7 ~) u8 m8 l- ?5 X                count_copy = buf.packet_cout;
# Y7 A5 _8 O( l) @  C        }
; M7 I3 |& J8 q9 _# Z        else
* n5 K/ o( ?. Y& @7 l: D' b2 H. [) U        {
0 p. V6 E4 F/ |                printf("No effective message!");
  U$ n8 J; t8 K& u) z        }- r$ X! X) l- a% U
}$ Z7 G+ H- X5 r3 s8 E4 }" Q

  v1 I3 o- U4 @+ Y4 u# u3 E, [
. J6 p) [! S+ Q# b8 s* ^但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。) r6 ?; i  P- |) ^" Z, i3 C
使用下面代码,对内存使用了mmap函数后:' L/ [0 ~( P9 N# F/ H& c
#include <stdio.h>
$ D7 W; k, L) d( w; t#include <unistd.h>; J' |) F1 S1 {7 C0 W, B) o
#include <sys/mman.h>7 ~7 \% B) ~( B( @
#include <sys/types.h>5 H7 k, z" m8 Y/ u/ ?: w  j
#include <fcntl.h>7 j% r1 \; C, o9 j
- [* b8 l/ f  _( O% C
#define SHAER_RAM_BASE_ADDR    (0x80000000)" A: i, Y/ r" ]3 q: B6 e
#define SHAER_RAM_SIZE         (0x20000)   4 b$ G6 u0 }5 H
' P& a- h  @* N' r3 v
typedef struct
- H9 H* |6 D( h0 l  X2 ~9 z{: I; X! y8 b+ ~6 r+ D" @$ A
        unsigned int a;
9 Q* [! y; E  M' N        unsigned int b;; O3 o( o" R7 q/ `
        unsigned int packet_cout;
  n8 T' ]5 x" R}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;, L4 G4 e7 z  }+ {7 ^! G* n

# ?& D* _+ U) Z" v! |: yvoid read_MSG_buffer(int *baseaddr);
+ y; |* S) n# n* Tunsigned int count_copy = 0;4 t' g1 B5 V+ A" D2 C0 W

, y' J' R( s$ N. [/ aint main()
$ c# W8 x2 F6 s5 a{/ p+ H' U- p1 {1 ^! L' w% N/ [
        int fd;
) b* ]+ p: Y9 W        int *mem = NULL;2 V) M1 n  w" A. _2 t0 L

- M1 e' {6 q5 s; V- M4 r        if((fd = open("/dev/mem", O_RDWR)) <0): p) z0 @* J0 B# g# I$ R
        {
) ^% n# B9 D4 f: u                perror("open error");) J- {* h% s! o7 e+ B
                return -1;. [9 s% i- W' H
        }, }& t2 x* ~0 @% E% ^, n
        
( k+ C8 ~* L$ x        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);: i# n+ P" q# [3 G4 ?* U( ~0 j

. \* g7 p, }- a/ `- F        while(1)) {1 t4 z* q$ ]6 P, |* k& C
        {
. m0 U7 ~. p, ~' ?0 ?                read_MSG_buffer(mem);
" E! l% _; V/ T& C( z        }                8 d  w4 |0 ~9 ?# U0 A; Q. ]' ?
}
6 U. m  K# Z' d3 ]4 L5 E+ C
8 U) w8 s0 @5 n1 i5 P* ovoid read_MSG_buffer(int *baseaddr)  p7 _; T6 z# a
{
) \3 a1 L  v: m% o8 ]        pRX_MSG_PROTOCOL pshreRAM = NULL;* Z+ k2 |5 n3 `! R' S( P* L6 O
& g& z' ~! d5 p' i( ?( D
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
& t: P' F3 u7 ]3 D2 f0 C& p% q5 x' A3 R) z6 d* G7 [* Q8 x$ w1 e2 ^
        if(pshreRAM->packet_cout != count_copy)
% P3 {7 m- q. ]8 \/ X! A% j* _        {
* u5 S* c2 ?+ Q/ P( ~" ^                printf("a is %d\n", pshreRAM->a);
, E8 z/ J/ b6 N# m( h                printf("b is %d\n", pshreRAM->b);
" j  ~1 U0 r" p4 p                printf("count is %d\n", pshreRAM->packet_cout);8 F1 ~# V* M3 }2 `$ `' S
                count_copy = pshreRAM->packet_cout;  `; l- ?0 w- I& ~. B
        }
; U# }! f  w4 E4 h. ]" M( a        else5 \& q' c4 ]' G- S- [6 V
        {
3 W- `1 n* Q( z0 e% E$ i1 M, \                printf("No effective message!\n");
; R  T4 B. \) z) S7 K        }
$ [6 n/ |% l$ t' n}/ X  E$ r+ q3 F# b

3 C  J; V! G. ]' H没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
1 w; m3 T- W; }: t2 o7 N2 }& f' @. h6 U! I) O2 e9 Z, F

0 R  b: B" ]% ^& |
7 Y# O( z* p% N! K! C0 g! F+ S: e4 A- N6 i
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-24 18:44 , Processed in 0.039739 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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