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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 $ Y) _( T3 o" v  x. A
% [* \! a0 v0 H$ U, T# `% J
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
  T# j+ G# l' W# _1 f) v6 y+ J0 G4 H#include <unistd.h>8 G  Z" c1 r# i2 u9 W; A8 x! P4 v6 [
#include <sys/mman.h>7 T- @5 q1 r: ?! r  [3 M. h$ d
#include <sys/types.h>
4 t' H9 n/ n; I#include <fcntl.h>
5 {( U' L) r- k  I& ^5 R% v) m' H4 b- M( f" `
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
9 w6 w# }6 m0 T* m
, V2 B4 }. A3 V7 v" Ntypedef struct
9 H# K% P# U$ J{
4 z6 i; M* _# p4 h        unsigned int a;1 K& [2 ^( l4 Z! g$ o3 K7 }. ^
        unsigned int b;# f8 F) s: m3 v/ P/ ]5 P
        unsigned int packet_cout;
# b9 k* e4 Q/ N5 ^% h}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% z9 J# b) u/ ^1 V% f& L
+ R/ i! I0 ^5 w2 j0 }3 a2 pvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);* J' z, F) F! g) p7 K: q8 A
unsigned int count_copy = 0;
/ I  n2 e( H. X0 u) Z/ B2 x6 t* r9 r# y3 c$ n6 [; q8 y" P
) S8 X" S" ]0 w% p8 c0 H0 k' p, g
int main()
: E# P& r" F6 ?) z% X5 \$ W/ k* o{
) g. M% d. z: n+ g        pRX_MSG_PROTOCOL pshreRAM = NULL;( A9 v9 A9 e1 z! ?4 u/ A/ O0 q+ `4 n+ e
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;( x* U* H  {% T

7 y2 I3 Z, v" _3 g0 s0 u! N        while(1)
7 |6 m) e* l/ A  C& V* U& O        {
, m8 v( ^; P4 z& v0 O$ G4 C                read_MSG_buffer(pshreRAM);
6 a' d9 E+ A# C' B, H, C8 S        }               
; t0 M( s( Q  e- q- r& D}
* Q+ x2 k3 o' \  P- D. u+ ~1 `% s7 \% L2 |5 S
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)9 P5 I* l. c2 L
{
6 _8 r: X% v, @9 o8 ]        RX_MSG_PROTOCOL buf;
' C: j5 ?2 O" v" J        
) g! \6 a( a6 P$ s7 w3 V+ n        buf.a = pshreRAM->a;! g; n- i* T: z8 y" w' j
        buf.b = pshreRAM->b;
5 ]$ T9 x% P. e/ Z4 R        buf.packet_cout = pshreRAM->packet_cout;  q+ E) Y' u; X' Q  K7 Z  h
        0 ?2 h( ~0 d2 L2 f, {' Y3 u/ q* G
        if(buf.packet_cout != count_copy)
) Z$ {* ~1 ^! `0 R3 h" ?        {
0 x1 o" y; J* N                printf("a is %d\n", buf.a);0 E3 O/ j/ P4 H; s0 g
                printf("b is %d\n", buf.b);
. q+ p/ R7 E  t. L4 g; M5 `) N                printf("count is %d\n", buf.packet_cout);, N; V1 }" {6 s7 h% e5 ?
                count_copy = buf.packet_cout;
# }0 i, q7 J6 V; ?( y' B! v0 X        }) s% J' J7 a- [, R  L
        else4 W, ~9 C: v9 d, ~: q
        {
. u* N3 @0 i2 \9 {/ z) l* D                printf("No effective message!");
' e# f! j$ x# Y) d4 y        }; e4 t& Z& D: P& W+ G
}) @7 G2 Y1 g2 {$ \
! F& Z7 e2 j+ j2 E% a5 ]+ v! O
+ J; M) c. {$ o* Z' ]1 @8 p/ ]/ `
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
. |( a' a  M! z# t& N- D* J' `使用下面代码,对内存使用了mmap函数后:
; G& [! n! E  u$ ]+ j4 \7 C3 b#include <stdio.h>" b$ l6 v: ~* l9 ?  Z7 ]2 J: A6 E& E
#include <unistd.h>
1 U) U3 h' C8 O+ }$ m0 o$ i+ n& t#include <sys/mman.h>
/ }4 d2 {# l% f. f' m#include <sys/types.h>
' l; S/ ~! R* d% b" {#include <fcntl.h>
: k% y% k1 F, ?! `! y% e
( k3 x: _/ @1 R8 A- m; w0 ]9 e4 Z#define SHAER_RAM_BASE_ADDR    (0x80000000)* l. h: w- p+ R% d& H+ y) e
#define SHAER_RAM_SIZE         (0x20000)   ! O' F4 l9 n, t4 F( }' {3 B

, o( i' q! l' K$ g+ D: |0 f) b4 Dtypedef struct: J  x9 u& S- i0 T( i1 L
{
! Z( v+ W6 Q1 A+ _) d        unsigned int a;8 X( C9 _+ o1 i! y  O+ E
        unsigned int b;; s  q% D% m0 ]% {0 `8 g
        unsigned int packet_cout;
8 O+ x' n  ^- X4 k) T! c}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;9 C& P  D0 g' m# R8 ~! X9 ]5 P* b

# m% g, Q: G3 G( }1 ~* I- r1 Q' qvoid read_MSG_buffer(int *baseaddr);, d( H# i) o2 O+ `( h5 U+ w- _
unsigned int count_copy = 0;
* X3 u5 x3 _+ [; D4 M) `7 y, R( R7 h8 y# w
int main()& I3 E( j- E' B: A
{' S1 r. a  T+ q4 g# E
        int fd;
4 I1 U  P/ i3 K3 s5 H" G        int *mem = NULL;5 I7 m& ?7 y5 {" ~3 M* S6 p1 g
, x# ^- Y9 |, b8 x0 [+ U4 ]- {
        if((fd = open("/dev/mem", O_RDWR)) <0)7 z" t% c% B( ?7 \
        {
" P9 g/ p0 G$ X- G5 R0 F3 D3 n                perror("open error");3 c) s' L% F! Z6 g, @4 F" b5 u
                return -1;
& o7 `4 r" y8 V0 B$ n0 d  y        }
2 }# y+ m& x8 [6 C7 ^: X' t        
& J( M1 T& E4 h+ r7 |        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
- J' S* Q1 b! g1 H3 E6 ]; X# L0 K7 ?
        while(1)$ S! X2 U" B9 l7 o$ |+ E8 ?
        {, \0 U& ?  n3 T& ?# S3 _
                read_MSG_buffer(mem);; ?6 w6 E" D# ~% n/ R& E0 h
        }                2 V: @3 _: F3 Y* N
}
  [, c( b; R; p  L  z2 j3 ~- H4 X( Q( L2 L+ v# D, a; ?$ S
void read_MSG_buffer(int *baseaddr)) M9 `: d8 Y& L
{
% Y. K' q" j6 A4 J& R2 Y2 T1 D0 m        pRX_MSG_PROTOCOL pshreRAM = NULL;& v0 O% _6 E1 |# s$ b) O

$ o! [( y3 B( R        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;, ~2 F+ A* v5 |0 c# d
2 A! \9 E; O0 o  T, ]
        if(pshreRAM->packet_cout != count_copy)
9 t" [! l" i: {        {! g  F+ Q* Q" v7 W
                printf("a is %d\n", pshreRAM->a);/ P1 M$ k" K+ V& }
                printf("b is %d\n", pshreRAM->b);& b! c* s8 J( L
                printf("count is %d\n", pshreRAM->packet_cout);$ ]$ d9 O% g/ q8 X
                count_copy = pshreRAM->packet_cout;" \% X, R; r. k% h# ~( |) e
        }
* n0 V/ q8 y, z/ q        else
6 O1 T6 R- h& C  C        {
6 m' r2 S$ U- H& J4 S* K                printf("No effective message!\n");
' j$ g$ E3 A6 A0 K# ~        }
- T" Y( T) z4 L' Z) m}+ u* e/ ^7 L# i: m; C: |
  a+ N9 c& H, |) P) N
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
& K6 z/ ~# B: s5 {
' `4 J8 g2 l: v% H0 d+ \- L/ M# F* X. e/ k3 e0 J

2 o  h/ R) V0 g* C+ T6 k
9 x/ E3 q0 w- M  b$ y4 E
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-4 05:21 , Processed in 0.041188 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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