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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
9 K; V9 R# F7 @. c/ F9 u
+ h6 C; D9 [+ EOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
8 A9 d" N; t1 e. V9 J; P& P#include <unistd.h>/ w3 O$ p" P: X( o, e
#include <sys/mman.h>
. k1 n5 Q- p" ^/ L) f#include <sys/types.h>
, P+ y# |1 |! S4 c; v; r4 z#include <fcntl.h>' v4 b+ |( x% g  s+ M3 _- |
; y0 E4 X6 n- ?% ?
#define SHAER_RAM_BASE_ADDR    (0x80000000)   $ c3 J. O! W* ?. n# u* n

* S, Q, S& e6 i1 A8 o  S4 @typedef struct
# _. i- v; p; K' c" J% `, J; i{( {$ j# ~9 F, H: r" _+ ?/ a
        unsigned int a;6 Z6 I/ O7 {8 h$ ?
        unsigned int b;
1 r' \0 F: Y% F8 g  Z        unsigned int packet_cout;  U  M" f' P' o, q' X$ l9 P
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. b; t  |6 l4 Z7 g

! O& h$ ?, M5 Q* t# mvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
: c+ N6 ]" t' O: c0 }  Kunsigned int count_copy = 0;; [4 e0 `. F! {* }5 M5 Y

% q0 `6 K# S2 ^: r0 j+ Y- x, U) w' m. w- g9 x8 S& w
int main()0 e% }1 o, }4 _8 ^: E8 D/ Q" p- c
{
+ C6 j# J) d1 Q0 d  x        pRX_MSG_PROTOCOL pshreRAM = NULL;
0 d) \/ v7 W. q9 Y        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;3 z) |  q& a& y/ `9 R3 B
! `4 z, w, V, z% u# |
        while(1). U  R( f: G$ X3 ~. t* T- _8 m
        {5 T( z; {/ T  x) Y; S
                read_MSG_buffer(pshreRAM);
& Y+ D) ]) v' E, y+ @        }                : ^0 d; {1 P3 L! `0 K, i
}2 h4 x- y5 T2 N: K, r( M1 T
% V8 O0 y( q4 e6 H
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
; h: J/ t/ u% T+ F! [{
5 {: w( A# F0 h8 Y, E8 `+ r. c        RX_MSG_PROTOCOL buf;
) `  E& S) y+ G( \) A, _        
5 Y+ R8 }6 _% r7 }4 f2 f        buf.a = pshreRAM->a;
% d) E9 `9 T8 j8 F        buf.b = pshreRAM->b;
2 P# }! ?. P8 _+ g7 E% m; F7 }        buf.packet_cout = pshreRAM->packet_cout;+ A$ N( N7 X. j$ D- c) c
        
" }0 b) M" {: K8 @* z( h2 j        if(buf.packet_cout != count_copy)
+ F: ?# \& O$ d        {- f# D- H/ W& N5 G# g5 ]
                printf("a is %d\n", buf.a);' R& n' B& ?: k, M+ ], w/ h+ \
                printf("b is %d\n", buf.b);
; j( K0 E4 T) o3 x2 {                printf("count is %d\n", buf.packet_cout);# A- w4 ~+ X" P0 k
                count_copy = buf.packet_cout;  K" ^7 i( k  [$ o* r) S8 {
        }5 W  p! t) o6 J. r- o2 b: v9 p
        else
1 B( M8 C6 ?5 E- H) k, O) l  v        {
& k$ U: g" F  c, B2 {                printf("No effective message!");
- P5 V$ l5 G+ |* a) {( k        }
3 M  P* F* E0 P}2 k' w9 P7 N2 l
! {) F, O; I) N0 }6 F; b; p

2 R7 k3 T8 E$ N$ z* J6 U% H但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
- {6 k  K4 o7 R2 L使用下面代码,对内存使用了mmap函数后:
8 N' C. e" Q- G% }#include <stdio.h>
8 l7 a  ]& t9 j  p- j, {9 }#include <unistd.h>
/ s% [0 i4 q! t- C#include <sys/mman.h>0 c6 k6 K/ ^9 J! c/ V
#include <sys/types.h>5 w8 ~3 @8 a3 l/ }5 C6 @) }; ]# W1 k
#include <fcntl.h>
" Y% G2 ]: i- D/ w& p- W1 r" P; b% N, u( k$ a8 }- V5 S
#define SHAER_RAM_BASE_ADDR    (0x80000000)
9 g6 k( K/ \- j2 k- b! n. B6 {8 ?#define SHAER_RAM_SIZE         (0x20000)   
, o1 c* P" A) \9 Y  n( k* `" Q
* E- T2 U; o/ r0 b! N' B+ ~7 |5 A' \typedef struct
" F$ |$ L( S7 b5 O5 c+ o{
+ q3 b: M$ x6 D% v+ A1 r        unsigned int a;
: b7 t8 O# {. F" X/ P- {( f. O; D        unsigned int b;
$ Q2 t8 W  }9 U, Y6 ]( _0 p        unsigned int packet_cout;; F9 G: t7 o+ g$ a% B/ m
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) x. J, t# R5 |' Z2 Q9 M4 C# [
2 J2 q# ?) q  k" t0 e3 ]! n1 I
void read_MSG_buffer(int *baseaddr);
# f/ y) I- N$ j, Tunsigned int count_copy = 0;
8 s0 U' @+ a3 o2 A3 I( @
" @* X4 F2 m8 C' ^1 hint main()' F9 c) R7 w5 `! l9 ]& h
{7 h* e2 N: g( |5 ?
        int fd;9 E0 G! p$ B1 `4 z$ |
        int *mem = NULL;' Q8 I# e1 O' R& T. Y% v

& k9 c5 {, B* U3 q* Z        if((fd = open("/dev/mem", O_RDWR)) <0)$ i, ?. a2 b) T* n
        {) K. X: A6 o6 d6 G/ h  t
                perror("open error");
8 \  {$ ]1 y+ [( H; x3 F  H                return -1;- S2 l! k$ N0 z0 H# L# r
        }
* O7 L2 [# z7 T! u$ D" w1 Y/ l5 \. ?        
6 K. r# \9 ^# H$ m        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);! L3 ]7 P8 I2 a

6 ?% m$ m! w5 F( p1 A2 k4 `        while(1)
* P6 k' L: [, s$ y        {  D8 R* v( g' s2 Q. E* e6 p
                read_MSG_buffer(mem);
" q$ U" x$ [5 T! L/ }  _# \+ T1 }        }                  x9 D" C9 u  Y% ]! v
}( {/ u3 s' B9 V! Z

- s5 j! c! l. Hvoid read_MSG_buffer(int *baseaddr)! `: U' b) z! n' b& D# _
{
7 `  b( N; w) r        pRX_MSG_PROTOCOL pshreRAM = NULL;  U" j& U1 y# Q: I% g+ b! |, R

( x- t5 o' P  L; b        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;* G5 q: K5 d4 M7 z+ z
- k% D0 D1 n+ U/ Q. v6 c- @
        if(pshreRAM->packet_cout != count_copy)$ D% T; K7 X* V/ r1 |
        {
9 H; I' C) ]& `+ ~1 ?                printf("a is %d\n", pshreRAM->a);
. |8 j! X8 M( n                printf("b is %d\n", pshreRAM->b);
8 E7 h, [) S. x1 ^/ I                printf("count is %d\n", pshreRAM->packet_cout);& e) p1 g% j9 w6 M) Q3 E" x9 p
                count_copy = pshreRAM->packet_cout;2 D0 ]/ O9 K5 d
        }
% x0 Q0 T' A: V! Q, }9 ?/ p        else
3 T  }- v- K6 ?" L5 x: U. V        {
# \" p. w1 _) d  L; I1 Q5 P5 p8 P6 K                printf("No effective message!\n");
. V$ e4 o) G/ G9 J' z. {" ?' f        }3 c7 x3 _. y5 D8 d
}
9 a: `. J! Q$ J2 T8 f7 N. E
8 l! G: P& ]' h5 L# X1 L, W* C没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???- x' p( u6 ?4 i! X

4 F7 }7 P* f& p
# I5 `2 Y7 E0 X" ?: V5 _% B; [% J) v% `6 H% n0 Q, |
5 g: j' O  m$ Y- s+ ?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-28 11:21 , Processed in 0.041896 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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